Как найти максимальное количество символов в строке

I’m working on a lab (in Python 3) that requires me to find and print the character in a string that occurs most frequently. For example:

>>> print(maxCharCount('apple'))
['p']

The idea is to do this using a loop, but I’m confused about how to do this.

zondo's user avatar

zondo

19.8k8 gold badges44 silver badges83 bronze badges

asked Mar 2, 2016 at 1:24

Kelsey 's user avatar

2

def maxCharCount(ss):
    return max(ss, key=ss.count)

answered Mar 2, 2016 at 1:39

bddap's user avatar

bddapbddap

5294 silver badges8 bronze badges

2

def max_char_count(string):
    max_char = ''
    max_count = 0
    for char in set(string):
        count = string.count(char)
        if count > max_count:
            max_count = count
            max_char = char
    return max_char

print(max_char_count('apple'))

answered Mar 2, 2016 at 1:40

ChrisFreeman's user avatar

ChrisFreemanChrisFreeman

5,6814 gold badges20 silver badges32 bronze badges

Since you really want to use a for loop:

a = 'apple'
m = set(a)
max = 0
for i in m:
    if a.count(i) > max:
         max = a.count(i)

edit: I didnt read good, you actually want the letter not the number of times it appear so i edit this code into:

a = 'apple'
m = set(a)
max = 0
p = ''
for i in m:
        if a.count(i) > max:
             max = a.count(i)
             p = i

answered Mar 2, 2016 at 1:38

pipiripi's user avatar

2

def count(char, string):
    c = 0
    for s in string:
        if char == s:
            c += 1
    return c

def max_char_count(string):
    biggest = string[0]
    for c in string:
        if count(c,string) > count(biggest,string):
            biggest = c
    return biggest

answered Mar 2, 2016 at 1:52

bddap's user avatar

bddapbddap

5294 silver badges8 bronze badges

Подскажите пожалуйста нужно выполнить задание: “Напишите программу, где пользователь вводит сначала количество строк n, затем сами строки. Среди данных строк найти строку с максимальным количеством различных символов. Если таких строк будет много, то вывести первую”.

Первую часть выполнила, а найти строку с максимальным количеством различных символов не могу понять
Мой код:

public class Main {
public static void main(String[] args) {
    int n = 0;
    int m = 0;
    //Ввод количества строк с клавиатуры
    System.out.println("Введите количество строк");
    Scanner sc1 = new Scanner(System.in);
    n = sc1.nextInt();
    String[] str = new String[n];
    Scanner sc2 = new Scanner(System.in);
    for (int i = 0; i < str.length; i++) {
        System.out.println("Введите строку №" + (i + 1));
        str[i] = sc2.nextLine();
    }
        }
    }

задан 9 фев 2022 в 19:16

Юлия Евграфова's user avatar

1

Чтобы найти количество уникальных символов в строке, можно текущую строку (ещё в процессе чтения) преобразовать во множество символов (set), и найти наибольший размер такого множества.

Если нельзя использовать множества и другие классы (списки, хэш-таблицы) из стандартной библиотеки Collections Framework, можно завести отдельный массив чисел/булевых значений, затем заполнить этот массив для соответствующего символа текущей строки (инкремент для числа или запись true для булевого значения), затем посчитать количество чисел, больших 0 / или значений true (сразу обнуляя их), обновить при необходимости максимум / запомнить соответствующую строку с максимумом.

Реализация в коде не приводится в педагогических целях.

ответ дан 9 фев 2022 в 20:14

Nowhere Man's user avatar

Nowhere ManNowhere Man

11.4k17 золотых знаков15 серебряных знаков27 бронзовых знаков

3

public static void main(String[] args) {
    int n = 0;
    //Ввод количества строк с клавиатуры
    System.out.println("Введите количество строк");
    Scanner sc1 = new Scanner(System.in);
    n = sc1.nextInt();
    String[] str = new String[n];
    Scanner sc2 = new Scanner(System.in);
    for (int i = 0; i < str.length; i++) {
        System.out.println("Введите строку №" + (i + 1));
        str[i] = sc2.nextLine();
    }
    for (int i = 0; i < str.length; i++) {
        System.out.println(str[i]);
    }
    int[] count = new int[n];  //Создаем массив для длин строк

    for (int i = 0; i < str.length; i++) {
        // Первый луп для итерации по элементам массива str
        for (int j = i; j < str[i].length(); j++) {
        // этот луп для того чтобы сохранить текущий символ  
            char temp = ' ';
            for (int z = j; z < str[i].length(); z++) {
            //Текущий символ в третьем лупе будет сравниваться с каждым символом в данной строке

                if (str[i].charAt(j) != str[i].charAt(z) && temp != str[i].charAt(z)) {
                // Если текущий символ не будет равен следующему символу то делаем count[]++ то есть прибавляем длину
                    temp = str[i].charAt(z);                                            
                    count[i]++;                                                 
                }
            }
        }
    }
    int max = 0;
    String answer = "";
    for (int i = 0; i < count.length; i++) {
        // Ищем строку с максимальной длиной различных символов и если второй больше первого сохраняем строку
        if (max <= count[i]) {
            max = count[i];
            answer = str[i];
        }
    }
        
    System.out.println(answer);                                                   // ФИНИШ
}

Но можно еще ArrayList-ом воспользоваться и сохранить символы строк как элемент ArrayList, а затем воспользоваться методом contains(): если возвращает false, то прибавляем длину.

Nowhere Man's user avatar

Nowhere Man

11.4k17 золотых знаков15 серебряных знаков27 бронзовых знаков

ответ дан 10 фев 2022 в 6:29

Nurdaulet Agabek's user avatar

2

Добавлено 2 октября 2021 в 16:01

После того, как вы создали строку, часто бывает полезно узнать ее длину. Здесь в игру вступают операции с длиной и емкостью.

Длина строки

Длина строки – это довольно просто, это количество символов в строке. Для определения длины строки есть две идентичные функции:

size_type string::length() const
size_type string::size() const

Обе эти функции возвращают текущее количество символов в строке, исключая завершающий ноль.

Пример кода:

string sSource("012345678");
cout << sSource.length() << endl;

Вывод:

9

Хотя, чтобы определить, есть ли в строке какие-либо символы или нет, можно использовать length(), но более эффективно использовать функцию empty():

bool string::empty() const

Возвращает true, если в строке нет символов, иначе – false.

Пример кода:

string sString1("Not Empty");
cout << (sString1.empty() ? "true" : "false") << endl;
string sString2; // пустая
cout << (sString2.empty() ? "true" : "false")  << endl;

Вывод:

false
true

Есть еще одна функция, связанная с размером, которую вы, вероятно, никогда не будете использовать, но мы опишем ее здесь для полноты картины:

size_type string::max_size() const

Возвращает максимальное количество символов, которое может содержать строка. Это значение будет варьироваться в зависимости от операционной системы и архитектуры системы.

Пример кода:

string sString("MyString");
cout << sString.max_size() << endl;

Вывод:

4294967294

Емкость строки

Емкость (вместимость) строки показывает, сколько памяти выделено объектом строки для хранения ее содержимого. Это значение измеряется в строковых символах, исключая символ завершающего нуля. Например, строка с емкостью 8 может содержать 8 символов.

size_type string::capacity() const

Возвращает количество символов, которое строка может хранить без перераспределения памяти.

Пример кода:

string sString("01234567");
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;

Вывод:

Length: 8
Capacity: 15

Обратите внимание, что емкость больше, чем длина строки! Хотя длина нашей строки равна 8, на самом деле она занимала достаточно памяти для 15 символов! Зачем так сделано?

Здесь важно понимать, что если пользователь хочет поместить в строку больше символов, чем позволяет ее емкость, то для получения большей емкости строка должна быть перераспределена в памяти. Например, если строка имеет длину и емкость 8, то добавление любых символов в строку приведет к переразмещению объекта в памяти. Сделав емкость больше размера фактической строки, пользователь получил некоторое буферное пространство для расширения строки до необходимости перераспределения.

Как оказалось, перераспределение – это плохо по нескольким причинам:

Во-первых, перераспределение строки относительно дорого. Сначала необходимо выделить новую память. Затем каждый символ в строке необходимо скопировать в новую память. Если строка большая, это может занять много времени. Наконец, необходимо освободить старую память. Если вы выполняете много перераспределений, этот процесс может значительно замедлить работу вашей программы.

Во-вторых, всякий раз, когда строка перераспределяется, адрес содержимого строки в памяти изменяется на новое значение. Это означает, что все ссылки, указатели и итераторы строки становятся недействительными!

Обратите внимание, что строки не всегда размещаются с емкостью, превышающей длину. Рассмотрим следующую программу:

string sString("0123456789abcde");
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;

Эта программа выводит:

Length: 15
Capacity: 15

Результаты могут отличаться в зависимости от компилятора.

Давайте добавим к строке один символ и посмотрим, как изменится емкость:

string sString("0123456789abcde");
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;

// Теперь добавим новый символ
sString += "f";
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;

Это дает следующий результат:

Length: 15
Capacity: 15
Length: 16
Capacity: 31

void string::reserve()
void string::reserve(size_type unSize)

Второй вариант этой функции устанавливает емкость строки минимум на unSize (она может быть больше). Обратите внимание, что для этого может потребоваться перераспределение.

Если вызывается первый вариант этой функции или второй вариант вызывается с unSize, меньшим, чем текущая емкость, функция попытается уменьшить емкость, чтобы она соответствовала длине. Этот запрос необязателен для выполнения.

Пример кода:

string sString("01234567");
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;

sString.reserve(200);
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;

sString.reserve();
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;

Вывод:

Length: 8
Capacity: 15
Length: 8
Capacity: 207
Length: 8
Capacity: 207

В этом примере показаны две интересные вещи. Во-первых, хотя мы запросили емкость 200, на самом деле мы получили емкость 207. Гарантируется, что емкость всегда будет не меньше, чем вы запросили, но может быть и больше. Затем мы запросили изменение емкости, чтобы она соответствовала длине строки. Этот запрос был проигнорирован, так как емкость не изменилась.

Если вы заранее знаете, что собираетесь создать большую строку, выполняя множество строковых операций, которые увеличивают размер строки, вы можете избежать многократного перераспределения строки в памяти, сразу установив для строки необходимую ей емкость:

#include <iostream>
#include <string>
#include <cstdlib> // для rand() и srand()
#include <ctime>   // для time()

using namespace std;

int main()
{
    std::srand(std::time(nullptr)); // инициализация генератора случайных чисел

    string sString{};    // длина 0
    sString.reserve(64); // резервируем 64 символа

    // Заполняем строку случайными строчными буквами
    for (int nCount{ 0 }; nCount < 64; ++nCount)
        sString += 'a' + std::rand() % 26;

    cout << sString;
}

Результат этой программы будет меняться каждый раз. Вот результат одного выполнения:

wzpzujwuaokbakgijqdawvzjqlgcipiiuuxhyfkdppxpyycvytvyxwqsbtielxpy

Вместо того чтобы перераспределять sString несколько раз, мы устанавливаем емкость один раз, а затем заполняем строку. Это может очень влиять на производительность при формировании больших строк с помощью конкатенации.

Теги

C++ / CppLearnCppstd::stringstd::wstringSTL / Standard Template Library / Стандартная библиотека шаблоновДля начинающихЕмкостьОбучениеПрограммирование

Нахождение строки с наибольшим числом символов

Задача:

Узнать и вывести на экран номер строки текстового файла с наибольшим числом символов.

Решим на двух языках. Вот ответ для си шарп:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NumberStr
{
    class Program
    {
        static void Main(string[] args)
        {

            int counter = 1;
            int StrLength = 0;
            int numberS = 0;
            string line;

            System.IO.StreamReader file = new System.IO.StreamReader(@"C:Program Files (x86)Notepad++change.log");
            while ((line = file.ReadLine()) != null)
            {
                
                if (line.Length > StrLength) { 
                    StrLength = line.Length;
                    numberS = counter;
                }
                counter++;
            }

            file.Close();
            System.Console.WriteLine("Номер строки с максимальным числом символов: "+numberS);
            System.Console.ReadLine();

        }
    }
}

А это на java:

package up7;

import java.util.*;
import java.io.*;


public class Up7 {
    
static int num = 0;
static int num2 = 0;
static String[] array;

public static void main (String args[]) {
List list = new ArrayList();
try{ Scanner in = new Scanner(new File("C:\Program Files (x86)\Notepad++\change.log"));
while (in.hasNextLine()) 
    list.add(in.nextLine());

array = (String[]) list.toArray(new String[0]);
} 
catch (Exception e) 
{ System.out.println(e); } 

for (int i = 0; i&il;array.length; i++) { 
     
if (num&il;array[i].length()) {
    num = array[i].length();
    num2 = i+1; 
}
} 

System.out.println("Номер строки с максимальным числом символов: "+num2); 
    }
}

Пара комментариев к решениям. В качестве текстового файла берется C:Program Files (x86)Notepad++change.log – лог от нотепада. Сначала построчно его читаем, сохраняем в массив, затем этот массив проходим и ищем наибольшее значение. Потом выводим. Как видите, все просто. Комментарии, вопросы – пишите на up777up@yandex.ru, не забыв предварительно закинуть пару рублей сюда.


Автор этого материала – я – Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML – то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, задачи, си шарп, java

zvezdato

0 / 0 / 0

Регистрация: 12.09.2022

Сообщений: 2

1

Найти максимально количество символов в строке, идущих подряд

12.09.2022, 14:09. Показов 3445. Ответов 4

Метки ifelse, python, циклы (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте, есть задача:

Нужно найти максимально количество символов в строке, идущих подряд

Python
1
stroka = "aasdffgjfifffffkjwerfjidjtrddrrrrrrrrswwwlgjrhtfuvirrrrrslslgkgbnjjjllwii"

Есть код (не мой), который работает, и я не понимаю, почему

Python
1
2
3
4
5
6
7
8
9
k = 1 
maxx = 0 
for i in range(len(stroka)-1): 
    if stroka[i] == stroka[i+1]:
        k += 1
    if stroka[i] != stroka[i+1]:
        maxx = max(maxx,k)
        k = 1
print(maxx)

Буду благодарна, если вы человекопонятным языком поясните, почему нужно строкой if stroka[i] != stroka[i+1]: останавливать цикл. Разве невыполнение первого if-а автоматически не означает остановку цикла и переход к следующей итерации?



0



2413 / 1455 / 633

Регистрация: 01.11.2021

Сообщений: 2,266

12.09.2022, 14:32

2

Первый if считает подряд идущие одинаковые символы. Как только следующий символ не равен предыдущему, то сработает второй if, который запишет в переменную maxx максимальную длину одинаковых подряд идущих символов вычисленную до и на текущий момент и обнуляет счетчик, т.е. выставляет его на первоначальное значение – 1.



1



iSmokeJC

Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

15823 / 8956 / 2596

Регистрация: 21.10.2017

Сообщений: 20,642

12.09.2022, 14:35

3

Цитата
Сообщение от zvezdato
Посмотреть сообщение

невыполнение первого if-а автоматически не означает остановку цикла и переход к следующей итерации?

С чего бы это?

Кликните здесь для просмотра всего текста

Python
1
print(max(map(lambda x: len(x[0]), re.finditer(r'(.)1+', input()))))



1



zvezdato

0 / 0 / 0

Регистрация: 12.09.2022

Сообщений: 2

12.09.2022, 15:24

 [ТС]

4

Цитата
Сообщение от Alexarh
Посмотреть сообщение

Первый if считает подряд идущие одинаковые символы. Как только следующий символ не равен предыдущему, то сработает второй if, который запишет в переменную maxx максимальную длину одинаковых подряд идущих символов вычисленную до и на текущий момент и обнуляет счетчик, т.е. выставляет его на первоначальное значение – 1.

А разве не так?
Первый if считает подряд идущие символы, то есть, пока True, он плюсует к счетчику единицу. И как только правило, записанное в True, перестаёт работать, счетчик обнуляется.

…но тогда код будет выглядеть так. Вроде работает

Python
1
2
3
4
5
6
7
8
9
k = 1 
maxx = 0 
for i in range(len(stroka)-1): 
    if stroka[i] == stroka[i+1]:
        k += 1
        maxx = max(maxx,k)
    else:
        k = 1
print(maxx)



0



Alexarh

2413 / 1455 / 633

Регистрация: 01.11.2021

Сообщений: 2,266

12.09.2022, 15:51

5

Это почти то же самое. Если первый не сработает if, то сработает второй или наоборот.
Второй if можно заменить на else, ничего не поменяется, проверок меньше будет только.
А вот строку:

Python
1
maxx = max(maxx,k)

лучше перенести в блок else, зачем вычислять каждый раз максимум длины из подстрок, если подсчет одинаковых символов еще не закончился. Вот когда закончили их считать, встретился другой символ, тогда и берем максимальную длину.



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

12.09.2022, 15:51

5

Добавить комментарий