2017-02-07 18 views
1

Я пытаюсь построить функцию, которая получает строку букв и печатает количество каждой буквы в строке. , например: вход: String = "aaabbaccxyxyx" выход: 4a2b2c3x2yjava, как найти количество букв в строке без повторений

Это то, что я придумал:

public class Q1 { 
    public static String numLetters(String s){ 
     String end = new String(); 
     int counter = 0; 
     char c,d; 
     for(int i=0; i<s.length();i++){ 
      c = s.charAt(i); 
      for(int j=0; j<s.length();j++){ 
       d = s.charAt(j); 
       if(c == d){ 
        counter++; 
       } 
      } 
      end = end + counter+c; 
      counter = 0; 
     } 

     return end; 
    } 

, но это выход: 4a4a4a2b2b4a2c2c3x2y3x2y3x Много повторов ..

Любая помощь, как это исправить? Имейте в виду, что функция должна вернуть строку , а не только распечатать ее. Спасибо! =)

+1

Возможный дубликат [Как подсчитать частоту символов в строке?] (Http://stackoverflow.com/questions/6712587/how-to-count-frequency-of-characters-in-a- string) –

+0

Это не дубликат, функция должна возвращать строку, а не просто распечатывать ее –

ответ

1

Я хотел бы сделать int массив, чтобы сохранить количество каждой буквы в в строке. Потому что есть 26 букв, то length массива должен быть 26:

public static String numLetters(String s) { 
    int[] count = new int[26]; 
    for (int i = 0; i < s.length(); i++) { 
     char c = s.charAt(i); 
     count[(int)(c - 'a')]++; 
    } 
    String ans = ""; 
    for (int i = 0; i < 26; i++) { 
     if (count[i] != 0) { 
      ans += String.valueOf(count[i]) + (char)(i + 'a'); 
     } 
    } 
    return ans; 
} 
+0

, который может быть полезен, но посмотрите на главу «public static String», функция должна вернуть строку. –

+0

@ItayBenMoshe Теперь я отредактирую свой ответ, отметьте его как true, если вы сочтете это полезным –

+0

отличная работа! Вы забыли создать переменную c 'char', но все остальное просто здорово! Благодаря! :) –

0

Попробуйте это:

int count = StringUtils.countMatches("a.b.c.d", "."); 
+0

это java, а не C++ ... –

+0

Извините, я поменял ее на решение Java – user3272686

+0

Это все еще не отвечает на вопрос , и, кажется, плагиат из [здесь] (http://stackoverflow.com/q/275944/5743988). Если вы считаете, что этот вопрос является дубликатом, пожалуйста, отметьте вопрос как таковой. – 4castle

1

Несложный вариант может выглядеть следующим образом:

public static String countChars(String arg) { 
    String res = ""; 
    boolean[] counted = new boolean[arg.length()]; 
    for (int i = 0; i < counted.length; i++) { 
     if (!counted[i]) { 
      char c = arg.charAt(i); 
      int counter = 1; 
      for (int j = i + 1; j < counted.length; j++) { 
       if (arg.charAt(j) == c) { 
        counter++; 
        counted[j] = true; 
       } 
      } 
      res += counter + "" + c; 
     } 
    } 
    return res; 
} 
+0

'O (n^2)' в среднем, посмотрите на мой ответ –

1

Если вы хотите сохранить свою первоначальную структуру, я предлагаю использовать StringBuilder, чтобы вы могли удалить символы, которые вы уже видели. Если вы удалите символ, вы должны настроить свои индексы i и j.

public static String numLetters(String str){ 
    StringBuilder s = new StringBuilder(s); 
    String end = new String(); 
    int counter = 0; 
    char c,d; 
    for(int i=0; i<s.length();i++){ 
     c = s.charAt(i); 
     for(int j=0; j<s.length();j++){ 
      d = s.charAt(j); 
      if(c == d){ 
       s.deleteCharAt(j); 
       if (i >= j) i--; 
       j--; 
       counter++; 
      } 
     } 
     end = end + counter+c; 
     counter = 0; 
    } 

    return end; 
} 
+0

неэффективен, я бы предпочел не использовать такой подход –