Как найти самое длинное слово в строке java
Перейти к содержимому

Как найти самое длинное слово в строке java

  • автор:

Как найти самое длинное слово в строке java

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

Сообщений: 15

Скрипт-нахождения длинного слова(Перенесено из Java SE)

Как найти самое длинное слово в строке и вывести его в alert?
Жду ответа очень нужно..в инете нету времени искать
вот мой скрипт который делает разбиение строк-каждую четную строку выводит большими буквами и вот осталось найти самое длинное слово и высети его отдельно в Alert.

Скрипт разбиения строк

Нахождение самого длинного слова в тексте, недочеты алгоритма — Java

Здравствуйте, столкнулся с небольшой проблемой, задача — написать программу, которая ищет самое длинное слово в тексте, вводимого построчно, причем слова могут быть разделены любыми символами, кроме «_». Сама программа удалась, но с большими объемами текста за нужное время не справляется. Прошу помощи с ее оптимизацией или изменения алгоритма работы. Цель — проанализировать текст содержащий до 500 000 символов менее чем за секунду.

import java.util.Scanner; public class Start < public static void main(String [] args) < Scanner in = new Scanner(System.in); String str = "",max = ""; while (in.hasNextLine())< str += " " + in.nextLine(); >String[] strL = new String[90000]; //массив слов for (int i = 0; i for (int i=0,k=0;i 47 && chr < 58) || (chr >64 && chr < 91 ) || (chr >96 && chr < 123) || (chr == 95))< strL[k] = strL[k]+str.charAt(i); // проверяю, находится ли символ, разделяющий слова, если нет, прибавляю символ к слову, иначе, перехожу к следующему >else > for (String aStrL : strL) < //нахожу наибольшее слово if (aStrL.length() >max.length()) < max = aStrL; >> System.out.println(max); > > 

P.S. Первый раз пишу на Stack Overflow, заранее извиняюсь за ошибки и недочеты)
Отслеживать
задан 15 фев 2017 в 10:01
Кирилл Пешков Кирилл Пешков
3 1 1 серебряный знак 6 6 бронзовых знаков

Необходимо ли забивать strL пустыми строками? Лучше использовать не String , а StringBuilder или StringBuffer . В последнем переборе можно бежать не по всему массиву, а до заранее известного числа вставленных слов. Имхо сортировка, как предложили в ответе, применительно к задаче с такими требованиями — зло

15 фев 2017 в 10:47

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

15 фев 2017 в 11:07

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Я бы сделал вот так:

Scanner scanner = new Scanner(System.in); String wordWithMaxLength = ""; while (scanner.hasNextLine()) < String[] words = scanner.nextLine().split("(_|\\s)+"); Arrays.sort(words, Comparator.comparing(String::length, Comparator.reverseOrder())); wordWithMaxLength = words[0].length() >wordWithMaxLength.length() ? words[0] : wordWithMaxLength; > System.out.println(wordWithMaxLength); 

Если версия java < 8:

Arrays.sort(words, new Comparator() < @Override public int compare(String o1, String o2) < return Integer.compare(o2.length(), o1.length()); >>); 

Отслеживать
ответ дан 15 фев 2017 в 10:16
14.9k 1 1 золотой знак 21 21 серебряный знак 40 40 бронзовых знаков

Компилятор ругается на строку Arrays.sort(words, Comparator.comparing(String::length, Comparator.reverseOrder()));

15 фев 2017 в 10:30
@КириллПешков java 8 нужна
15 фев 2017 в 10:38
А вот с этим проблема. У меня-то java 8ая, а вот на сервере — нет. Есть еще какие-нибудь варианты?
15 фев 2017 в 10:44

Теперь быстро, но не правильно) Ввод: 678+23467.89+87909-234_L/43 // Error Вывод: 678+23467.89+87909-23 Ввод: Voronezh State University is one of the main universities in Central Russia. Вывод: universitie и т.п. То есть он проглатывает последнюю букву иногда + игнорирует некоторые символы(

15 фев 2017 в 11:22

Я не знаю по каким символам происходит разбиение на слова. В моем ответе основная идея заключается в том, что строку делим на слова. Разбиение происходит на основе регулярного выражения — (_|\\s)+ — нижнее подчеркивание либо символ пробела. задайте указанные символы в регулярке и все будет работать.

15 фев 2017 в 11:27

Вариант такой ( но могут быть косяки с граничными условиями и предполагается что слово не может быть разорвано переносом строки, нужно проверять на реальных данных ):

 Scanner in = new Scanner(System.in); String line, max = ""; int start = 0; while (in.hasNextLine()) < line = in.nextLine(); for (int i=0; i47 && chr < 58) || (chr >64 && chr < 91 ) || (chr >96 && chr < 123) || (chr == 95))< >else < if ( i - start >max.length() ) < max = line.substring( start, i ); >start = i+1; > > start = 0; > System.out.println(max); 

Отслеживать
ответ дан 15 фев 2017 в 11:26
2,191 2 2 золотых знака 13 13 серебряных знаков 26 26 бронзовых знаков

Благодарю, я понял смысл, но тесты все-равно какие-то чудеса творят. При вводе только чисел или только подчеркиваний — на выводе пусто. Даже не знаю как это понимать. Возможно из-за того, что кроме нужных символов, в вводе ничего нет, то есть else ни разу не выполняется, но это предположение. P.S. Переносов слова через строку — нет.

15 фев 2017 в 11:44

Как можно поставить проверку на то, кончилась строка или нет? А то если имеем на ввод: 1 22 333 4444 55555, то на выводе будет 4444 и т.п.

15 фев 2017 в 11:52
Я начал добавлять не читаемый символ в конец каждой строки и все заработало, огромное спасибо)
15 фев 2017 в 12:08
@КириллПешков Как раз граничные условия — не всё предусмотрел, извиняюсь) А так — всегда пожалуйста
15 фев 2017 в 12:58

На всякий случай альтернативный вариант решения. Умеет корректно работать с русскими буквами. Если словом является набор цифр, то вместо Character.isLetter() надо использовать Character.isLetterOrDigit() На моей машине сработал быстрее, чем предолженный в ответе. Также, если нет необходимости, можно убрать обработку переноса строки.

String getLongestWord(String s) < //Символ подчеркивания и переноса строки final char underLine = '_'; final char nextLine = '\n'; //Результирующая строка String result = ""; //Счетчик кол-ва символов переноса int nextLines = 0; //Флаг наличия данного символа у результирующего слова boolean resultHasNextLines = false; //Массив символов, в котором ведем поиск char[] searchArray = s.toCharArray(); //Значение индекса начала текущего слова int wordStartIndex = 0; //Флаг нахождения в слове boolean inWord = true; //Проходим по всем строкам for (int i=0;i> else 0 ? i - wordStartIndex - nextLines : i - wordStartIndex; //Если эта длина больше чем предыдущая максимальная if (len > result.length()) < //Обновляем результирующую строку result = s.substring(wordStartIndex, i); //Устанавливем триггер символа новой строки для результирующего слова resultHasNextLines = nextLines>0; > else nextLines = 0;//Иначе не забываем сбросить счетчик символов новой строки inWord = false; > > > //Если были символы новой строки убираем их из результата. if (resultHasNextLines) result = result.replaceAll(String.valueOf(nextLine),""); return result; > 

2.3 Обработка строк

В листинге 2.2 представлена программа, которая определяет, сколько раз встретилось заданное слово в строке. Слово – это последовательность алфавитно-цифровых символов, после которых следует разделитель. Результат выполнения программы представлен на рис. 2.2. В листинге 2.2 представлена программа, а на рис. 2.2 – результат выполнения программы. Листинг 2.2 Подсчет количества вхождений слова в текст

Import java.Lang.*;

Import java.Io.*;

Import java.Util.*;

public class Main public static void main(String[] args) String str, word; int k = 0; String si; Scanner in = new Scanner(System.in); System.out.println(«Введите строку текста:») ; str = in.nextLine(); System.out.println(«Введите слово:») ; word = in.nextLine(); StringTokenizer st = new StringTokenizer(str, » \t\n\r,.-«); while(st.hasMoreTokens()) < si = st.nextToken(); // Получаем слово if (word.equalsIgnoreCase(si)) k++; > System.out.println(«Количество вхождений заданного слова justify»> > > Рисунок 2.2 – Результат выполнения программы

2.4 Задание 2

  1. Подсчитать в строке число букв А и В, если букв А больше, чем В, то удалить в строке все буквы В.
  2. Строка содержит английский текст. Подсчитать количество слов, начинающихся на заданную букву.
  3. Дана символьная строка, заканчивается точкой. Найти длину самого длинного и самого короткого слова.
  4. Имеется строка символов, содержащая буквы латинского алфавита и цифры. Найти длину наибольшей последовательности цифр, идущих подряд.
  5. Найти слова, начинающиеся и заканчивающиеся на одну и ту же букву.
  6. Программа считывает символы и затем запрашивает строку на ввод. Проверяет можно ли из введенных символов составить данную строку.
  7. Ввести две строки, изъять из первой строки все слова, которые встречаются во второй.
  8. Составить программу разделения текста на подтексты. В качестве разделителя текста принимается знак «.» (точка).
  9. Дана символьная строка, заканчивающаяся точкой. Вывести на экран слова, начинающиеся с гласных букв.
  10. Имеется строка символов, содержащая буквы латинского алфавита. Определить, сколько в ней слов, состоящих из не более чем четырех букв.
  11. Считать текст из файла и вывести на экран только предложения, состоящие из заданного количества слов.
  12. Имеется строка символов, содержащая буквы латинского алфавита. Вывести на экран слова текста, начинающиеся и оканчивающиеся на гласные буквы.
  13. Имеется строка символов, содержащая буквы латинского алфавита. Заменить каждую первую букву слов, начинающихся с гласной буквы, на прописную.
  14. Дана символьная строка, заканчивающаяся точкой. Заменить цифры от 0 до 9 на слова «ноль», «один», …, «девять».
  15. Дана символьная строка, заканчивающаяся точкой. Найти самое длинное слово и определяет, сколько раз оно встретилось в тексте.

Самое длинное слово в строке

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

Следует ввести счетчик букв в слове. В цикле по символам строки пока очередной символ не пробел, счетчик увеличивается. Как только встречается пробел, следует сравнить значение счетчика со значением, записанным в переменной для хранения размера самого длинного слова. Если слово, которое сейчас было «измерено», длиннее, то записать его длину в эту переменную. Кроме того, надо запомнить индекс начала этого слова. Он определяется вычитанием длины слова из текущего индекса.

После того, как очередное слово было обработано, надо сбросить счетчик букв на 0.

Поскольку последнее слово может не оканчиваться пробелом, то оно будет не учтено. Поэтому после цикла надо проверить текущее значение счетчика букв.

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

Pascal

Вывести самое длинное слово в строке паскаль

 
var
s: string;
i, id, len, max, count: byte;

begin
readln(s);
len := length(s);
max := 0; // длина самого длинного слова
id := 0; // индекс начала самого длинного слова
count := 0;
for i:=1 to len do
if s[i] <> ' ' then
count := count + 1
else begin
if count > max then begin
max := count;
id := i - count;
end;
count := 0
end;

if count > max then begin // проверка последнего слова
max := count;
id := len - count + 1;
end;

writeln(copy(s,id,max));
end.
 

one two three four five six seven
three

Язык Си

 
#include < stdio.h>
#include < string.h>
main() char s[100];
int i, id, max, count, len;
gets(s);
len = strlen(s);
max = 0;
/> count = 0;
for (i=0; i < len; i++)
if (s[i] != ' ') count += 1;
else if (count > max) max = count;
- count;
>
count = 0;
>

if (count > max) max = count;
- count;
>
max += id;
for (i=id; i < max; i++)
putchar(s[i]);
printf("\n");
>

Python

найти самое длинное слово в строке python (питон)

 
# Вариант 1 - классический алгоритм
s = input()
l = len(s)
m = 0
ind = 0
count = 0
for i in range(l):
if s[i] != ' ':
count += 1
else:
if count > m:
m = count
ind = i - count
count = 0

if count > m:
m = count
ind = i - count + 1

print(s[ind:ind+m])


# Вариант 2 - с помощью встроенных функций и методов
s = input()
s = s.split()
print(max(s, key=len))

КуМир

 
алг самое длиное слово
нач
лит s
цел i,id,len,mx,count
ввод s
len := длин(s)
mx := 0
id := 0
count := 0
нц для i от 1 до len
если s[i] <> " " то
count := count + 1
иначе
если count > mx то
mx := count
id := i - count
все
count := 0
все
кц
если count > mx то
mx := count
id := len - count
все
вывод s[id:id+mx]
кон

Basic-256

 
input s$
l = length(s$)
m = 0
id = 0
c = 0
for i=1 to l
b$ = mid(s$,i,1)
if b$ <> " " then
c = c + 1
else
if c > m then
m = c
id = i -c
endif
c = 0
endif
next i

if c > m then
m = c
id = i-c
endif

print mid(s$,id,m)

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *