Всем доброго времени суток. Можете ли помочь найти длину самого минимального слова в строке
разделенной пробелами на Java.
ReinRaus
17.7k3 золотых знака43 серебряных знака84 бронзовых знака
задан 5 апр 2012 в 15:14
Andrey2517Andrey2517
853 золотых знака5 серебряных знаков14 бронзовых знаков
3
Примерно так на Java
String x="sdfds ds dsfsdf sdfs sdf sdf";
String[] xx=x.split(" ");
int min=1000000;
for (String i: xx){
if (i.length()>0 && i.length()<min) min=i.length();
}
P.S. Мини-реклама Python
x="sdfds ds dsfsdf sdfs sdf sdf"
minlen=min(map(len, filter(lambda y: y!='', x.split(' '))))
ответ дан 5 апр 2012 в 15:45
ReinRausReinRaus
17.7k3 золотых знака43 серебряных знака84 бронзовых знака
12
<script>
function find_min(str)
{
str=str.replace(/,/g, "");
arr = str.split(' ');
max_len = 0;
for(i=0;i<=arr.length-1;i++)
if(arr[i].length>max_len) {newstr=arr[i]; max_len=arr[i].length;}
return newstr;
}
alert(find_min("Yesterday, all my troubffffffles seemed so far away Now it looks as though they're here to stay Oh, I believe in yesterday."));
</script>
Блин, так ведь сначала нужна была реализация на JS ! Тьфу)
ответ дан 5 апр 2012 в 15:42
2
ИМХО, современный C# (3.0 и выше) ничем не уступает Пайтону по красоте и выразительности.
using System;
using System.Linq;
class Program
{
static void Main()
{
Console.WriteLine(Console.ReadLine().Split()
.OrderBy(x => x.Length).LastOrDefault());
// можно еще так, вроде выглядит попроще, но работает медленнее
Console.WriteLine(Console.ReadLine().Split().Max(x => x.Length));
}
}
ответ дан 20 мар 2015 в 5:46
VadimTukaevVadimTukaev
2,12712 серебряных знаков16 бронзовых знаков
Ловите студонята.. Писал 20 хв с вышеуказанным примером (лабораторная), макс и мин число..
package qq; import java.util.Scanner; public class alln { public static void main(String[] args){ Scanner sc = new Scanner(System.in); String x=sc.nextLine(); sc.close(); //String x="sdfds ds dsfsdf ds sdfs sdf sdf"; String[] xx=x.split(" "); int min = 1000000; int max = 0; int bufmin = 0; int bufmax = 0; String temp; String tempz; for(int i = 0; i < xx.length; i++) { temp = xx[i]; if (temp.length()<min){ min=temp.length(); bufmin=i; } } for(int i = 0; i < xx.length; i++) { tempz = xx[i]; if (tempz.length()>max){ max=tempz.length(); bufmax=i; } } System.out.print("Min: "+min+" ("+xx[bufmin]+") ; Max: "+max+"
(«+xx[bufmax]+») ;»);
} }
ответ дан 20 мар 2015 в 0:03
10
$begingroup$
Given a regular language $L$ and a regular expression $r$ with $L=L(r)$. Is it possible to determine the minimum length of words of $L(r)$ by the structure of $r$?
A straightforward example:
Let’s say we have a regular expression $r=aac^*aa$, then $L(R) = {aaaa, aacaa, aaccaa, dots, aac^naa}$. To determine the minimal length I would erase everything that is postfixed with $*$, leaving $r’=aaaa$. Now I would count the concatenations and add 1, which would yield in this example, not unsurprisingly, a minimum length of 4.
Is there a general approach to do this for more complex expressions?
Sidenote: I need to achieve this without the help of automata.
asked Nov 14, 2019 at 13:28
$endgroup$
$begingroup$
First, notice that you can easily eliminate $emptyset$ for all regular expressions other than a regular expression describing the empty language. To do this, you use the following rewriting rules, which define an operator $E$ on regular expressions:
- $E[sigma] = sigma$, $E[epsilon] = epsilon$, $E[emptyset] = emptyset$.
- $E[r_1 r_2]$ is $emptyset$ if one of $E[r_1],E[r_2]$ is $emptyset$, and $E[r_1]E[r_2]$ otherwise.
- $E[r_1 + r_2]$ is $E[r_1]$ if $E[r_2] = emptyset$, $E[r_2]$ if $E[r_1] = emptyset$, and $E[r_1] + E[r_2]$ otherwise.
- $E[r^*] = epsilon$ if $E[r] = emptyset$, and $E[r]^*$ otherwise.
You can prove inductively that $E[r]$ either doesn’t contain $emptyset$, or is equal to $emptyset$.
Applying these rewriting rules, we have either determined that the denotation of the regular expression is empty, or are given a regular expression without $emptyset$. Now we define an operator $m$ which determines the length of the minimal word in an $emptyset$-free regular expression:
- $m(sigma) = 1$, $m(epsilon) = 0$.
- $m(r_1r_2) = m(r_1) + m(r_2)$.
- $m(r_1 + r_2) = min(m(r_1),m(r_2))$.
- $m(r^*) = 0$.
You can also implement both operators at once, by allowing $m$ to output $infty$ (meaning that the language defined by the regular expression is empty):
- $m(sigma) = 1$, $m(epsilon) = 0$, $m(emptyset) = infty$.
- $m(r_1r_2) = m(r_1)+m(r_2)$, where $infty + ell = ell + infty = infty$.
- $m(r_1+r_2) = min(m(r_1),m(r_2))$, where $min(infty,ell) = min(ell,infty) = ell$.
- $m(r^*) = 0$.
answered Nov 14, 2019 at 15:24
Yuval FilmusYuval Filmus
274k26 gold badges301 silver badges493 bronze badges
$endgroup$
2
$begingroup$
The general idea from the previous answer is right but unnecessarily inefficient.
Compute a NFA recognizing the regular expression. Find with BFS the shortest path from the start state to some endstate.
The corresponding word is the shortest accepted word.
answered Nov 14, 2019 at 13:52
DanielDaniel
4161 gold badge3 silver badges8 bronze badges
$endgroup$
4
$begingroup$
Is there a general approach to do this for more complex expressions?
Yes, there is a way. Note that a regular language is the language accepted by a NFA/DFA so the general approach to problems of this kind is to convert your expression into its corresponding NFA/DFA and then lexicographically search through all the words of the language until you find the first one that is accepted by your machine (reach the final state). I am not aware of other general methods besides this one.
answered Nov 14, 2019 at 13:43
Yamar69Yamar69
1,0436 silver badges11 bronze badges
$endgroup$
1
RayPas 2 / 0 / 0 Регистрация: 18.01.2013 Сообщений: 370 |
||||
1 |
||||
Найти минимальную длину слова в строке22.04.2015, 02:11. Показов 8238. Ответов 8 Метки нет (Все метки)
нужно найти минимальное длину слова в строке, проблема выделена жирным — хочу каждую длину(посчитанную до пробела или конца строки) сохранять в массиве, а потом в конце выбрать из массива минимум, но на этапе промежуточного сохранени и при наращивании счетчика значение стирается…где правильно и грамотно его нарастить, чтоб данные в массиве сохранялись для дальнейшего анализа? за помощь благодарю
0 |
BroDIK 90 / 91 / 51 Регистрация: 19.06.2013 Сообщений: 323 |
||||
22.04.2015, 09:35 |
2 |
|||
Вы программист C++? Добавлено через 5 минут
1 |
RayPas 2 / 0 / 0 Регистрация: 18.01.2013 Сообщений: 370 |
||||
22.04.2015, 11:02 [ТС] |
3 |
|||
BroDIK, да дело в том, что никаких спец функций использовать нельзя кроме длин строки Добавлено через 17 минут
вот таки образом вроде запахало как надо, значения перестал стирать, все сохраняется
0 |
Kerry_Jr 3105 / 2590 / 1219 Регистрация: 14.05.2014 Сообщений: 7,236 Записей в блоге: 1 |
||||
22.04.2015, 11:20 |
4 |
|||
RayPas, так много лишних действий
Чуть исправил
2 |
BroDIK 90 / 91 / 51 Регистрация: 19.06.2013 Сообщений: 323 |
||||
22.04.2015, 11:26 |
5 |
|||
RayPas, а зачем Вы переприсваиваете переменные? Например count это тот же kol_vo_bukav? В связи с этим убрал h, count и length1 ну и исправил ошибки:
Добавлено через 1 минуту
1 |
2 / 0 / 0 Регистрация: 18.01.2013 Сообщений: 370 |
|
22.04.2015, 11:27 [ТС] |
6 |
все понял ребят, пасибо за правки
0 |
l00p 0 / 0 / 0 Регистрация: 16.04.2011 Сообщений: 16 |
||||
22.04.2015, 11:28 |
7 |
|||
Kerry_Jr, можешь пожалуйста вот эти строки объяснить?
Зачем это нужно было (minLength) и почему 255?
0 |
Kerry_Jr 3105 / 2590 / 1219 Регистрация: 14.05.2014 Сообщений: 7,236 Записей в блоге: 1 |
||||
22.04.2015, 11:41 |
8 |
|||
Зачем это нужно было (minLength) и почему 255? minLength — это минимальная длина слова, можно сделать не 255, а после объявления str присвоить minLength длину строки. Это делается для того, чтобы изначально это значение было длиннее любого слова в строке, чтобы в дальнейшем при сравнении можно было искать наименьшее значение
здесь проверяется условия:
1 |
0 / 0 / 0 Регистрация: 22.11.2015 Сообщений: 1 |
|
26.07.2016, 13:33 |
9 |
Подскажите пожалуйста, как узнать само слово, а не только длину?
0 |
Вывести все слова минимальной длины — одна из задач, которую преподаватели дают студентам. В данном уроке программирования разберём её решение на языке Java.
Условие задачи
Задача: Вывести все слова минимальной длины в консоль.
Используемый язык программирования — Java.
Решение задачи
Распишем алгоритм решения задачи:
- Считать из консоли входную текстовую строку
- Удалить из считанной строки знаки препинания и лишние пробелы
- Разбить строку на слова
- Найти минимальную длину слова и сохранить это число
- Вывести все слова, по длине равные найденному числу
Перейдем к программированию. Код сопровождается подробными комментариями.
Напишем статический метод класса, который удаляет знаки препинания из текста. Вы также можете его расширить, добавив знаки препинания, которые мы не учли.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public static String correctInputString(String in) { //удаляем знаки препинания и лишние пробелы in = in.replace(«.», «»); in = in.replace(«,», «»); in = in.replace(«;», «»); in = in.replace(«:», «»); in = in.replace(«!», «»); in = in.replace(«?», «»); in = in.replace(«.», «»); in = in.replace(«»», «»); //можете дополнить список in = in.replace(» «, » «); //удаляем лишние пробелы in = in.replace(» — «, » «); //удаляем тире return in; } |
Теперь закодируем метод, который разделяет строку на слова (с помощью оператора split создается массив) по признаку — наличию пробела между словами, далее ищет длину самого короткого слова и выводит все слова данной длины.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public static void findMinLengthAndOutput(String s) { String[] words = s.split(» «); int minLength = words[0].length(); //минимальная длина слова for(String word : words) { if(word.length() < minLength) { minLength = word.length(); } } for(String word : words) { if(word.length() == minLength) { System.out.println(word); } } } |
И теперь приведем код метода main, считывающего входную строку и вызывающего другие, написанные в уроке программирования, методы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public static void main(String[] args) { Scanner scan = new Scanner(System.in); String input = scan.nextLine(); System.out.println(«Исходная строка: « + input); input = correctInputString(input); System.out.println(«Обработанная строка: « + input); System.out.println(); System.out.println(«Слова минимальной длины:»); System.out.println(); findMinLengthAndOutput(input); } |
Демонстрация работы написанной программы приводится на скриншоте ниже.
Скачать исходник, написанный на Java в среде разработки IntelliJ IDEA, можно, нажав на кнопку:
Скачать исходник
Как Вы видите, вывести все слова минимальной длины — это довольно простая задача. На этом урок программирования завершён. Спасибо за прочтение статьи!
Запоролся на простой задаче.
На вход подается txt со строкой (до 200 символов), необходимо найти минимальную длину слова в этой строке. За слово считается последовательность английских букв (вот тут вопрос, последовательностью ведь не может быть одиночный символ?).
Наваял по-быстрому следующее:
#include "stdafx.h"
#include <stdio.h>
int main()
{
freopen("input.txt","r",stdin);
char c;
int n = 0;
int min = 1000;
while (scanf("%c", &c) == 1)
{
if(isalpha©)
n++;
else
{
if(n<min && n>1)
min=n;
n=0;
}
}
printf("%d", min);
fclose (stdin);
return 0;
}
Обычное предложение типа «Hello, the world!» считает нормально (the специально добавил). Однако если строка начинается не с буквы, или заканчивается буквой, или ещё какая-нибудь неестественная фигня, то считается криво. А надо, чтоб считались все последовательности, в независимости от их местонахождения.