count直接重复子串的出现

时间:2014-02-14 11:58:11

标签: java string substring

我正在尝试计算字符串中子字符串的直接重复次数。

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

编辑: 因为有些人在问,我试着澄清一下:s中有3次,但是我需要重复t次而没有任何其他角色。这将导致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;
}
我在做错了什么?还有更好/更快的方法吗?

4 个答案:

答案 0 :(得分:2)

String API中存在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

答案 1 :(得分: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;
}

答案 2 :(得分: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;
}

答案 3 :(得分: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);