Как найти длину минимального слова

Всем доброго времени суток. Можете ли помочь найти длину самого минимального слова в строке
разделенной пробелами на Java.

ReinRaus's user avatar

ReinRaus

17.7k3 золотых знака43 серебряных знака84 бронзовых знака

задан 5 апр 2012 в 15:14

Andrey2517's user avatar

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

ReinRaus's user avatar

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

AseN's user avatar

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

VadimTukaev's user avatar

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

Makovyak's user avatar

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

Webastronaut's user avatar

$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 Filmus's user avatar

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

Daniel's user avatar

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

Yamar69's user avatar

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

Метки нет (Все метки)


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

нужно найти минимальное длину слова в строке, проблема выделена жирным — хочу каждую длину(посчитанную до пробела или конца строки) сохранять в массиве, а потом в конце выбрать из массива минимум, но на этапе промежуточного сохранени и при наращивании счетчика значение стирается…где правильно и грамотно его нарастить, чтоб данные в массиве сохранялись для дальнейшего анализа? за помощь благодарю

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Text;
 
namespace Str
{
    class Program
    {
        public static void Main(string[] args)
        {
            int kol_vo_dlin=0;
            int count = 0;
            int kol_vo_bukav = 0;
            Console.WriteLine("Hello World!");
            
            int[] length1 = new int[10];
            int[] glob = new int[10];
            string str = "kfgkfhm gfh Сrern";
            int h=0;
            int j;
            
            if (str != null) {
            for (j=0; j != str.Length; j++) 
                
            
            {
            if (str[j] != 'n') {
                if (str[j] != ' ') {
                   count++;
                   kol_vo_bukav = count;
                    }
                [B]else {
                length1[h] = kol_vo_bukav;
                kol_vo_dlin = h;
                kol_vo_bukav=0;
                count=0;
                        }
                        glob = length1;
                        h++;
                }[/B]
        }
 
            
            int min = glob[1];
            for (int k=0; k<=kol_vo_dlin; k++) {
                if (min > glob[k])
                    min = glob[k];
            }
            Console.Write(min);
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}
}



0



BroDIK

90 / 91 / 51

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

Сообщений: 323

22.04.2015, 09:35

2

Вы программист C++?

Добавлено через 5 минут

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Text;
 
namespace Str
{
    class Program
    {
        public static void Main(string[] args)
        {
            int[] mini;
            string str = "kfgkfhm gfh Сrern";
            Console.WriteLine("Введенная строка: " + str);
            if (!String.IsNullOrWhiteSpace(str)) // Если строка не null и не пустая
            {
                char[] разделители = new char[] { ' ', 'n', 't' /*и т д*/ }; // Массив всвозможных разделителей между слов
                string[] слова = str.Split(разделители); // Разделить строку на массив слов
                // Ищем минимальное. Создадим переменные для минимального значения и
                // минимального индекса в масиве
                int minIndex = 0;
                int min = слова[minIndex].Length;
                for (int i = 0; i < слова.Length; i++)
                {
                    if (!String.IsNullOrWhiteSpace(слова[i])) // Тоже может оказаться пустым
                    if (слова[i].Length < min)
                    {
                        minIndex = i;
                        min = слова[minIndex].Length;
                    }
                }
                Console.WriteLine("Минимальный размер: " + min.ToString() + " букв(ы)");
                Console.WriteLine("Индекс слова в массиве: " + minIndex.ToString());
 
                /*Если Вам все еще нужен массив с минимальными
                 * значениями, то заполним его ниже*/
 
                mini = new int[слова.Length]; // Инициализируем массив с мин.значениями
                for (int i = 0; i < слова.Length; i++)
                {
                    mini[i] = слова[i].Length;
                }
            }
            else
            {
                Console.WriteLine("Пустая строка!");
            }
            Console.ReadKey();
        }
    }
}



1



RayPas

2 / 0 / 0

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

Сообщений: 370

22.04.2015, 11:02

 [ТС]

3

BroDIK, да дело в том, что никаких спец функций использовать нельзя кроме длин строки

Добавлено через 17 минут

C#
1
2
3
4
5
6
else {
                length1[h] = kol_vo_bukav;
                kol_vo_dlin = h;
                kol_vo_bukav=0;
                count=0;
h++; }

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



0



Kerry_Jr

Эксперт PHP

3105 / 2590 / 1219

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

Сообщений: 7,236

Записей в блоге: 1

22.04.2015, 11:20

4

RayPas, так много лишних действий

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
 
class Program
{
    public static void Main()
    {
      int wordLength, minLength = 255;
      Console.WriteLine("Hello world!");
      string str = "kfgkfhm gfh Сrern";
      Console.WriteLine(str);
      for (int i = 0; i < str.Length; ++i)
      {
         wordLength = 0;
         for (int j = i; str[j] != ' ' && str[j] != 'n' && j < str.Length; ++j)
         {
            ++wordLength;
            ++i;
         }
         if (wordLength > 0 && wordLength < minLength) minLength = wordLength;
      }
      Console.WriteLine("Minimal length: {0}", minLength);
      Console.ReadKey();
    }
}

Чуть исправил



2



BroDIK

90 / 91 / 51

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

Сообщений: 323

22.04.2015, 11:26

5

RayPas, а зачем Вы переприсваиваете переменные? Например count это тот же kol_vo_bukav? В связи с этим убрал h, count и length1 ну и исправил ошибки:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Text;
 
namespace Str
{
    class Program
    {
        public static void Main(string[] args)
        {
            //int count = 0;
            //int h = 0;
            //int[] length1 = new int[10];
            int[] glob = new int[10];
            int kol_vo_bukav = 0;
            int kol_vo_dlin = 0;
            int j;
            string str = "kfgkfhm gfh Сrern";
 
            Console.WriteLine("Hello World!");
            if (str != null)
            {
                for (j = 0; j != str.Length; j++)
                {
                    if ((str[j] != 'n') && (str[j] != ' ')) // объединил условия
                    {
                        kol_vo_bukav++;
                    }
                    else
                    {
                        glob[kol_vo_dlin] = kol_vo_bukav;
                        kol_vo_bukav = 0;
                        kol_vo_dlin++; // переменную "h" пересместил сюда 
                    }
                }
 
 
                int min = glob[0]; // поменял с 1 на 0
                for (int k = 0; k < kol_vo_dlin; k++) // убрал =
                {
                    if (min > glob[k])
                        min = glob[k];
                }
                Console.Write(min);
                Console.Write("Press any key to continue . . . ");
                Console.ReadKey(true);
            }
        }
    }
}

Добавлено через 1 минуту
и заметьте, что я не переписывал Вашу программу, а просто подкорректировал алгоритм! Конечно, вариант Kerry_Jr будет лучше, код оптимизирован…



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, можешь пожалуйста вот эти строки объяснить?

C#
1
2
int wordLength, minLength = 255;
if (wordLength > 0 && wordLength < minLength) minLength = wordLength;

Зачем это нужно было (minLength) и почему 255?



0



Kerry_Jr

Эксперт PHP

3105 / 2590 / 1219

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

Сообщений: 7,236

Записей в блоге: 1

22.04.2015, 11:41

8

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

Зачем это нужно было (minLength) и почему 255?

minLength — это минимальная длина слова, можно сделать не 255, а после объявления str присвоить minLength длину строки. Это делается для того, чтобы изначально это значение было длиннее любого слова в строке, чтобы в дальнейшем при сравнении можно было искать наименьшее значение

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

C#
1
if (wordLength > 0 && wordLength < minLength) minLength = wordLength;

здесь проверяется условия:
1) что длина слова больше 0, т.к. в строке могут идти подряд несколько пробелов или пробел и перенос строки, что в свою очередь повлечет пропуск внутреннего цикла. А если он будет пропущен, то wordLength будет равна 0, и без проверки это станет значением минимальной длины слова.
2)что найденная длина меньше имеющейся минимальной.
Если оба условия срабатывают, то minLength принимает значение минимальной длины слова в строке.



1



0 / 0 / 0

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

Сообщений: 1

26.07.2016, 13:33

9

Подскажите пожалуйста, как узнать само слово, а не только длину?



0



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

Условие задачи

Задача: Вывести все слова минимальной длины в консоль.

Используемый язык программирования — Java.

Решение задачи

Распишем алгоритм решения задачи:

  1. Считать из консоли входную текстовую строку
  2. Удалить из считанной строки знаки препинания и лишние пробелы
  3. Разбить строку на слова
  4. Найти минимальную длину слова и сохранить это число
  5. Вывести все слова, по длине равные найденному числу

Перейдем к программированию. Код сопровождается подробными комментариями.

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

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);

}

Демонстрация работы написанной программы приводится на скриншоте ниже.

Вывести все слова минимальной длины - урок программирования на vscode.ru

Скачать исходник, написанный на 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 специально добавил). Однако если строка начинается не с буквы, или заканчивается буквой, или ещё какая-нибудь неестественная фигня, то считается криво. А надо, чтоб считались все последовательности, в независимости от их местонахождения.

Понравилась статья? Поделить с друзьями:
  • Не получается безе как исправить ситуацию
  • Как найти скрытые сообщества в вк
  • Длина волны де бройля как найти
  • Как исправить взлом вконтакте
  • Как найти величину угла в равностороннем треугольнике