2014-02-14 5 views
0

Я пытаюсь подсчитать количество прямых повторений подстроки в строке.count непосредственно повторное появление подстроки

String s = "abcabcdabc"; 
String t = "abc"; 
int count = 2; 

EDIT: , потому что некоторые люди просят, я стараюсь разъяснить это: есть 3 раза т в е, но мне нужно число раз т повторяется без какого-либо другого характера. что приведет к 2, потому что d в моем примере не является начальным символом t. ('d'! = 'a').

Другой пример разъяснить это:

String s = "fooabcabcdabc"; 
String t = "abc"; 
int count = 0; 

Я знаю, как подсчитать число вхождений в строке, мне это нужно, чтобы повторять слева направо без перерыва!

Вот что я до сих пор, но я думаю, что я сделал простую ошибку в этом ...

public static int countRepeat(String s, String t){ 
    if(s.length() == 0 || t.length() == 0){ 
     return 0; 
    } 
    int count = 0; 
    if(t.length() == 1){ 
     System.out.println(s+" | " + t); 
     for (int i = 0; i < s.length(); i++) { 
      if (s.charAt(i) != t.charAt(0)){ 
       return count; 
      } 
      count++; 
     } 
    }else{ 
     System.out.println(s+" | " + t); 
     for (int i = 0; i < s.length(); i++) { 
      int tchar = (i- (count*(t.length()-1))); 
      System.out.println(i+ " | " + tchar); 
      if (s.charAt(i) != t.charAt(tchar)){ 
       return count; 
      } 
      if(tchar >= t.length()-1){ 
       count++; 
      } 
     } 
    } 
    return count; 
} 

что я делаю неправильно? И есть ли лучший/более быстрый способ сделать это?

+2

Вы знаете, '' String' имеет .indexOf() '... – fge

+0

Я знаю, но IndexOf() возвращает первое вхождение, которое в 0. Вы можете разместить пример кода с помощью IndexOf() что на самом деле отвечает на мой вопрос? – Kostronor

+0

Ну, 'String' также имеет' .subString() ';) Я до сих пор не понимаю, что вы подразумеваете под« подсчитываете количество прямых повторений »? – fge

ответ

1

Использование indexOf() делает код намного проще:

public static int startingRepeats(final String haystack, final String needle) 
{ 
    String s = haystack; 
    final int len = needle.length(); 

    // Special case... 
    if (len == 0) 
     return 0; 

    int count = 0; 

    while (s.startsWith(needle)) { 
     count++; 
     s = s.subString(len); 
    } 

    return count; 
} 
+0

это именно то, что я хочу, спасибо за простое решение! – Kostronor

+1

Обратите внимание: вы также можете использовать '.startsWith()' вместо '.indexOf()' – fge

+0

ваш код нуждается в проверке для len == 0, потому что тогда у вас бесконечный цикл! – Kostronor

2

В API-интерфейсе String существует метод str.indexOf(substring,index).

В псевдокоде это будет означать что-то вроде этого:

declare integer variable as index 
declare integer variable as count 
while index <= (length of string - length of substring) 
    index = indexOf substring from index 
    if index >= 0 
    increment count 
    end if 
end while 
+0

, это просто подсчет количества раз, когда подстрока представлена ​​в str и не проверяет прерывание. – Kostronor

+1

Да, с вашего вопроса было непонятно, какова была настоящая проблема. Сейчас я должен уйти в класс, но сегодня вечером я вернусь к этому вопросу и посмотрю, нужна ли помощь. –

0

Вот еще один калькулятор:

String s = "abcabcdabc"; 
String t = "abc"; 

int index = 0; 
int count = 0; 

while ((index = s.indexOf(t, index)) != -1) { 
    index += t.length(); 
    count++; 
} 

System.out.println("count = " + count); 
1

Эта версия не выделяет новые объекты (подстроки и т. д.) и просто ищет символы, в которых они должны быть.

public static void main(String[] args) { 
    System.out.println(countRepeat("abcabcabc", "abc")); // 3 
    System.out.println(countRepeat("abcabcdabc", "abc")); // 2 
    System.out.println(countRepeat("abcabcabcx", "abc")); // 3 
    System.out.println(countRepeat("xabcabcabc", "abc")); // 0 
} 
public static int countRepeat(String s, String t){ 
    int n = 0; // Ocurrences 
    for (int i = 0; i < s.length(); i ++) { // i is index in s 
     int j = i % t.length(); // corresponding index in t 
     boolean last = j == t.length() - 1; // this should be the last char in t 
     if (s.charAt(i) == t.charAt(j)) { // Matches? 
      if (last) { // Matches and it is the last 
       n++; 
      } 
     } else { // Do not match. finished! 
      break; 
     } 
    } 
    return n; 
} 
+0

Я сравнил ваше решение с решением fges, и его примерно в 7 раз быстрее, чем у вас! Кажется, что использование собственных функций имеет некоторые преимущества ... – Kostronor

+0

Я попытался написать чистый код и не самый быстрый код, но я ожидал, что это будет быстрее, по крайней мере, с помощью этих коротких строк, и большинство из них будут положительными. – aalku

Смежные вопросы