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

Как найти слово, в котором число различных символов минимально? Если таких слов несколько, найти первое из них.

Как это можно сделать?

aleksandr barakin's user avatar

задан 8 янв 2016 в 21:07

Neon's user avatar

2

Я так понял, что вам нужно в заданной строке найти слово, в котором число УНИКАЛЬНЫХ символов минимально (сколько раз они повторяются неважно)? Тогда что-то типа такого (если разделитель слов — пробелы):

def f(string):
    for i in string.split(' '):
        if (len(set(string)) > len(set(i))):
            string = i
    return string

UPD

Добавил вариант на случай ввода строки в форме NFD (спасибо @jfs):

import regex
def f1(string):

    def uniq(s):
        return regex.findall(r'X', s, regex.U)

    for i in string.split(' '):
        if (len(uniq(string)) > len(uniq(i))):
            string = i
    return string

ответ дан 8 янв 2016 в 21:55

Flowneee's user avatar

FlowneeeFlowneee

3,7991 золотой знак20 серебряных знаков31 бронзовый знак

5

Если символ это Unicode codepoint, то чтобы найти слово с минимальным кол-вом символов из списка words:

word = min(words, key=lambda w: len(set(w)))

Если символ это символ, видимый пользователю (grapheme cluster):

import regex as re # pip install regex
word = min(words, key=lambda w: len(set(re.findall(r'X', w))))

Если слова в тексте разделены символами пробелов (включая новый строки и Юникодные символы), то words = text.split().

ответ дан 12 янв 2016 в 8:40

jfs's user avatar

jfsjfs

51.8k11 золотых знаков107 серебряных знаков306 бронзовых знаков

2 / 2 / 2

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

Сообщений: 124

1

Найти слово, число разных символов в которых минимально

25.08.2015, 11:51. Показов 12193. Ответов 7


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

Добрый день! Нужна идея (не решение!) для данной задачи. Что-то мне подсказывает что нужно использовать какой-то Map. Заранее благодарен!



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

25.08.2015, 11:51

Ответы с готовыми решениями:

Ввести n слов с консоли. Найти слово, в котором число различных символов минимально
Помогите плз с заданием, не могу понять как сделать.
Ввести n слов с консоли. Найти слово, в…

Найти слово, число разных символов в котором минимально
Найти слово, число разных символов в которых минимально,если таких слов много,вывести самое первое…

Найти слово, в котором число различных символов минимально
Добрый вечер! Помогите, пожалуйста.
Ввести n слов с консоли. Найти слово, в котором число…

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

"Строка состоит из слов,…

7

Эксперт Java

2393 / 2219 / 564

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

Сообщений: 8,662

25.08.2015, 13:49

2

в каждом слове посчитать кол-во разных символов
сохранить все это дело в любую коллекцию.
Найти минимум в коллекции



0



61 / 61 / 15

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

Сообщений: 322

25.08.2015, 15:19

3

Очевидное решение: разбить функцией split исходную строку по символу ‘ ‘, затем в каждом элементе получившегося массива подсчитывать число разных символов и искать минимум (так, как это обычно делается — держать минимальное слово в какой-то переменной и сравнивать).
Вряд ли здесь можно будет избежать полного перебора.



0



2 / 2 / 2

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

Сообщений: 124

27.08.2015, 11:48

 [ТС]

4

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

в каждом слове посчитать кол-во разных символов
сохранить все это дело в любую коллекцию.
Найти минимум в коллекции

Интересует именно алгоритм сравнения символов. Берем первый символ, сравниваем со вторым, третьим и т.д. Потом второй с третьим, четвертым и т.д.?
Какую коллекцию посоветуете?



0



klopik

61 / 61 / 15

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

Сообщений: 322

27.08.2015, 20:29

5

Думаю, приблизительно так

Java
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
public class BullShitClass {
 
    
    private static int diffWords(String st){ // число уникальных символов
        StringBuffer u = new StringBuffer(); // строка, в которой каждый символ будет содержаться лишь однажды
        String c; // текущий символ в строке
        for (int i=0;i<st.length();i++) { // обход строки
            c = String.valueOf(st.charAt(i)); // получить текущий символ
            if (u.indexOf(c)==-1) // символ еще не встречался
                u.append(c); // добавляем
        }
 
        return u.length(); // возвращаем длину получившейся строки
    }
    
    public static void main(String[] args) {
        String[] a = {"Something", "abcdefghijklmnopq", "aaaaa","WHATEVER","..."};
        String goal = a[0]; // искомое слово
        System.out.println("Массив: ");
        for (int i=1;i<a.length;i++){
            System.out.print(a[i]+", "); // выводим очередной элемент
            if ( diffWords(a[i])<diffWords(goal))
                    goal = a[i]; // новый мин.эл
        }
        System.out.println("");
        System.out.println("Искомое слово: "+goal+", число разных символов: "+diffWords(goal));
    }
}

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



1



Monty_Python

8 / 8 / 6

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

Сообщений: 39

28.08.2015, 02:55

6

Лучший ответ Сообщение было отмечено Ньюбии как решение

Решение

Ньюбии, хэшмапа с головой хватит.
1. Создаешь массив/список слов, да хоть считаешь их из файла, не важно.
2. Создаёшь хешмап, ключом у тебя будут слова а значением кол-во нужных символов.
3. Считаешь количество нужных символов в каждом слове и добавляешь все в хешмап, в то же время ищешь минимальное значение.
4. Сравниваешь минимальное значение со значением в хешмапе и выводишь результат.
Ниже решение.

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

Java
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
import java.util.HashMap;
 
class Main {
    public static int countSigns(String text) {
        int counter = 0;
        char[] sign = text.toCharArray();
        boolean flag;
 
        for ( int i = 0; i < sign.length; i++ ) {
            flag = false;
            for ( int j = 0; j < i; j++ ) {
                if ( sign[i] == sign[j] ) {
                    flag = true;
                }
            }
            if ( flag == false ) {
                counter += 1;
            }
        }
        return counter;
    }
 
    public static void main(String[] args) {
        String[] words = {"R2-D2", "Troll", "Pechkin", "OLOLO!!11"};
        HashMap<String, Integer> hashMap= new HashMap<String, Integer>();
        int min = 999;
 
        for ( int i = 0, currentValue = 0; i < words.length; i++ ) {
            currentValue = countSigns(words[i]);
            hashMap.put(words[i], currentValue);
            if ( min > currentValue ) {
                min = currentValue;
            }
        }
 
        for ( HashMap.Entry<String, Integer> entry : hashMap.entrySet() ) {
            if ( entry.getValue().equals(min) ) {
                System.out.println(entry.getValue() + "=" + entry.getKey());
            }
        }
    }
}
Bash
1
2
3
4
#output:
4=R2-D2
4=Troll
4=OLOLO!!11



1



Ньюбии

2 / 2 / 2

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

Сообщений: 124

03.09.2015, 15:09

 [ТС]

7

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

Ньюбии, хэшмапа с головой хватит.

я пошел своим путем, но пока что-то неудачно
у меня есть не один стринг, а несколько в ArrayList

Java
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
    
HashMap<String, Integer> data = new HashMap<>();
                char[] charArray;
                int differentSymbols;
                
                for (String i : string) {
                    differentSymbols = 0;
                    String[] words = i.split("\s+");
                                                        
                    StringBuffer sb = new StringBuffer();
                    for (String s : words) {
                      sb.append(s);
                    }
                    
                    String word = sb.toString();
                                        
                    charArray = words.toString().toCharArray();
 
                    for (int j = 0; j < charArray.length; j++) {
                        for (int k = 0; k < j; k++) {
                            if (charArray[j] != charArray[k])
                                differentSymbols++;
                        }
                    }
                    data.put(word, differentSymbols);
 
                }
                for (HashMap.Entry<String, Integer> entry : data.entrySet()) {
                    for (HashMap.Entry<String, Integer> e : data.entrySet()) {
                        System.out.println(e.getKey());
                        System.out.println(e.getValue());



0



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11758 / 7258 / 1720

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

Сообщений: 13,274

03.09.2015, 16:23

8

Java
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
import java.util.*;
 
public class LessDiffLetters {
    static int diffLetters(String wrd) {
        Set<Character> chars = new HashSet<Character>();
        for ( char c : wrd.toCharArray() )
            chars.add(c);
        return chars.size();
    }
    
    public static void main(String[] args) {
        String[] strings = { "any many money more", "jingle bells jingle bells jingle all the way" };
        List<String> words = new ArrayList<String>();
        
        for ( String s: strings )
            words.addAll(Arrays.asList(s.split("\s+")));
        
        Collections.sort(words, new Comparator<String>() {
            public int compare(String a, String b) {
                return diffLetters(a) - diffLetters(b);
            }
        });
        
        for ( String w: words )
            System.out.println(w);
    }
}

Код

andrew@debppc:~/workspace/java/strings$ javac LessDiffLetters.java 
andrew@debppc:~/workspace/java/strings$ java LessDiffLetters 
all
any
the
way
many
more
bells
bells
money
jingle
jingle
jingle
andrew@debppc:~/workspace/java/strings$



1



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

03.09.2015, 16:23

Помогаю со студенческими работами здесь

Найти число слов, в которых символов больше четырёх
1 найти число слов в которых символов больше четырёх
2 является ли индикатором введённое слово с…

Найти минимально число
Даны четыре числа A,B,C,D. Найти минимальное. Результат хранить в ячейке min.

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

Найти все трехзначные натуральные числа, сумма цифр которых равна В, а само число состоит из разных цифр
Выполнить задание на C#
Найти все трехзначные натуральные числа, сумма цифр которых равна В, а…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

8

Основой html форм являются input поля, которые могу быть паролем, email-ом или любым другим типом данных. Эти элементы используются для взаимодействия с пользователем.

Однако, пользователь может ввести любое количество символов и отправить их на php обработку. А что, если он в поле Имя введет 1 символ или 1000? Давайте защитим нашу форму.

Пусть есть такой input: <input type=»text» name=»marka»>

1 способ. Самый простой метод задать минимальную и максимальную длину в поле — использование атрибутов minlength и maxlength. Иземним input так:

<input type=»text» name=»marka» minlength=»5″ maxlength=»20″>

Теперь если мы попробуем отправить форму, то браузер перехватит событие и проверит число символов введенных в этом поле. В случае, если их будет меньше 5, он выдаст предупреждение и не отправит форму. А maxlength=»20″ просто не даст пользователю ввести большее число символов, чем 20.

2 способ. Никто мне не мешает в 1 способе, открыть исходный код этой формы и удалить из input-а эти атрибуты — так я смогу легко обойти ограничения на ввод. Давайте напишем, код, который будет проверять введенное число символов пользователем и помечать поле красным, если что-то не так, а если все в порядке, то зеленым.

Проверка на минимальное число символов
$(‘[name=»marka»]’).on(«click keyup change blur», function() {
if($(this).val().length < 5) { $(this).attr(‘style’, ‘border: 1px solid red;’); } else { $(this).attr(‘style’, ‘border: 1px solid green;’); }
});

Проверка на максимальное число символов
$(‘[name=»marka»]’).on(«click keyup change blur», function() {
if($(this).val().length > 20) { $(this).attr(‘style’, ‘border: 1px solid red;’); } else { $(this).attr(‘style’, ‘border: 1px solid green;’); }
});

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

$(‘[name=»marka»]’).on(«click keyup change blur», function() {
if($(this).val().length >= 5 && $(this).val().length <= 20) { $(this).attr(‘style’, ‘border: 1px solid green;’); } else { $(this).attr(‘style’, ‘border: 1px solid red;’); }
});

При такой проверке, скрипт будет срабатывать при каждом нажатии клавиши. Если число символов будет меньше 5, поле станет красным, если от 5 до 20 — зеленым и если больше 20, то снова красным.

К сожалению, код проверки длины символов получился громоздким. В следующем материале я сделаю функцию форматирования input полей. И кстати, от злоумышленников, код не спасет — его также легко обойти, поэтому последняя проверка всегда должна идти методами PHP.

Stalker_RED

myPhone.addEventListener('keyup', function(evt){
  let length = this.value.length
  if (length < 9) msg.textContent = 'маловато будет!'
  else if (length == 9) msg.textContent = 'норм!'
  else if (length > 9  && length < 16) msg.textContent = 'э, хватит'
  else if (length > 15 && length < 31) msg.textContent = 'больше не надо'
  else if (length > 30) msg.textContent = 'остановись, демон!'
})

https://jsfiddle.net/5v7cdb5y/


Комментировать

Можно сделать как-то так:

<input type="text" name="phone" minlength="9" required>


Комментировать

I received the same interview question. I am a C++ candidate but I was in a position to code relatively fast in JAVA.

Java [Courtesy : Sumod Mathilakath]

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

class UserMainCode
{


    public String GetSubString(String input1,String input2){
        // Write code here...
        return find(input1, input2);
    }
  private static boolean containsPatternChar(int[] sCount, int[] pCount) {
        for(int i=0;i<256;i++) {
            if(pCount[i]>sCount[i])
                return false;
        }
        return true;
    }
  public static String find(String s, String p) {
        if (p.length() > s.length())
            return null;
        int[] pCount = new int[256];
        int[] sCount = new int[256];
        // Time: O(p.lenght)
        for(int i=0;i<p.length();i++) {
            pCount[(int)(p.charAt(i))]++;
            sCount[(int)(s.charAt(i))]++;
        }
        int i = 0, j = p.length(), min = Integer.MAX_VALUE;
        String res = null;
        // Time: O(s.lenght)
        while (j < s.length()) {
            if (containsPatternChar(sCount, pCount)) {
                if ((j - i) < min) {
                    min = j - i;
                    res = s.substring(i, j);
                    // This is the smallest possible substring.
                    if(min==p.length())
                        break;
                    // Reduce the window size.
                    sCount[(int)(s.charAt(i))]--;
                    i++;
                }
            } else {
                sCount[(int)(s.charAt(j))]++;
                // Increase the window size.
                j++;
            }
        }
        System.out.println(res);
        return res;
    }
}

C++ [Courtesy : sundeepblue]

#include <iostream>
#include <vector>
#include <string>
#include <climits>
using namespace std;
string find_minimum_window(string s, string t) {
    if(s.empty() || t.empty()) return;

    int ns = s.size(), nt = t.size();
    vector<int> total(256, 0);
    vector<int> sofar(256, 0);
    for(int i=0; i<nt; i++) 
        total[t[i]]++;

    int L = 0, R; 
    int minL = 0;                           //gist2
    int count = 0;
    int min_win_len = INT_MAX;

    for(R=0; R<ns; R++) {                   // gist0, a big for loop
        if(total[s[R]] == 0) continue;
        else sofar[s[R]]++;

        if(sofar[s[R]] <= total[s[R]])      // gist1, <= not <
            count++;

        if(count == nt) {                   // POS1
            while(true) {
                char c = s[L]; 
                if(total[c] == 0) { L++; }
                else if(sofar[c] > total[c]) {
                    sofar[c]--;
                    L++;
                }
                else break;
            }  
            if(R - L + 1 < min_win_len) {   // this judge should be inside POS1
                min_win_len = R - L + 1;
                minL = L;
            }
        }
    }
    string res;
    if(count == nt)                         // gist3, cannot forget this. 
        res = s.substr(minL, min_win_len);  // gist4, start from "minL" not "L"
    return res;
}
int main() {
    string s = "abdccdedca";
    cout << find_minimum_window(s, "acd");
}

Erlang [Courtesy : wardbekker]

-module(leetcode).

-export([min_window/0]).

%% Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

%% For example,
%% S = "ADOBECODEBANC"
%% T = "ABC"
%% Minimum window is "BANC".

%% Note:
%% If there is no such window in S that covers all characters in T, return the emtpy string "".
%% If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.



min_window() ->
    "eca" = min_window("cabeca", "cae"),
    "eca" = min_window("cfabeca", "cae"),
    "aec" = min_window("cabefgecdaecf", "cae"),
    "cwae" = min_window("cabwefgewcwaefcf", "cae"),
    "BANC" = min_window("ADOBECODEBANC", "ABC"),
    ok.

min_window(T, S) ->
    min_window(T, S, []).

min_window([], _T, MinWindow) ->
    MinWindow;
min_window([H | Rest], T, MinWindow) ->
    NewMinWindow = case lists:member(H, T) of
                       true ->
                           MinWindowFound = fullfill_window(Rest, lists:delete(H, T), [H]),
                           case length(MinWindow) == 0 orelse (length(MinWindow) > length(MinWindowFound)
                               andalso length(MinWindowFound) > 0) of
                               true ->
                                   MinWindowFound;
                               false ->
                                   MinWindow
                           end;
                       false ->
                           MinWindow
                   end,
    min_window(Rest, T, NewMinWindow).

fullfill_window(_, [], Acc) ->
    %% window completed
    Acc;
fullfill_window([], _T, _Acc) ->
    %% no window found
    "";
fullfill_window([H | Rest], T, Acc) ->
    %% completing window
    case lists:member(H, T) of
        true ->
            fullfill_window(Rest, lists:delete(H, T), Acc ++ [H]);
        false ->
            fullfill_window(Rest, T, Acc ++ [H])
    end.

REF:

  • http://articles.leetcode.com/finding-minimum-window-in-s-which/#comment-511216
  • http://www.mif.vu.lt/~valdas/ALGORITMAI/LITERATURA/Cormen/Cormen.pdf

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти уролога женщину уролога
  • Как найти время для фитнеса
  • Как составить вопросы к рассказу растрепанный воробей
  • Рено логан горит лампочка подушки безопасности как исправить ошибку
  • Печенка получилась твердая как исправить

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии