如何编写一个程序,返回另一个字符串中出现的字符串数?

时间:2016-07-02 16:01:57

标签: java string

所以我是编程新手。我正在使用java。现在我有一个我无法在教授java的网站上解决的任务。

这是作业

编写一个程序,返回另一个字符串中出现的字符串数。

E.g

输入:

第一个字符串:

第二串:学生们正在工程学院努力工作,因为他们喜欢它 输出:

3

注意:您应该只使用嵌套循环。不要使用indexOf或substring等方法。

enter image description here到达代码计算出现次数但在重复字母的情况下失败

E.g

输入:

First String:ooo

第二个字符串:wooooooooooooooooooooow

输出:21

它应该是7,因为ooo只重复了7次

1 个答案:

答案 0 :(得分:0)

在线性时间内使用z-function可以简单地解决这个问题。

int NumberOfcopies(String t, String h){
    // t = the first string i.e "ooo"
    // h = the second string i.e "wooooooooooooooooooooow"

    String s = t + "$" + h; // adding a sentinel character in between
    int n = s.length(); // length of new string
    int[] z = new int[n]; // z array

    // Code ref : http://e-maxx-eng.github.io/string/z-function.html
    int l = 0, r = 0;
    for (int i = 1; i < n; i++){
        if (i <= r)
            z[i] = Math.min(r - i + 1, z[i - 1]);
        while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i]))
            ++z[i];
        if (i + z[i] - 1 > r){
            l = i;
            r = i + z[i] - 1;
        }
    }

    //checking for all the occurance of string t in string h
    int res = 0;
    for (int i = t.length() + 1; i < n; ){
        if (z[i] == t.length()){
            //A copy is found so skip next t.length chars
            i += t.length();
            ++res; 
        }
        else ++i;
    }
    System.out.println("Number of Occurance : " + res);
    return res;
}
  

此字符串的Z函数是长度 n 的数组   第i个元素等于最大字符数   从与第一个重合的位置 i 开始   s的字符。

这可用于在另一个字符串 h 中查找字符串 t 的出现次数。假设我们将字符串t和h加入其间的Sentinel字符(Sentinel字符是在任一字符串中不出现的字符)以形成新字符串 s

让我们计算数组z[]中的z函数。

现在让我们从哨兵角色后面的字符开始搜索,即字符串h的字符。对于字符串h中的第i个字符(如果第i个字符属于字符串s),如果z[i]等于字符串t的长度(模式),那么它意味着从第i个字符开始,{{ 1}}字符与字符串s的第一个t.length()字符相同,这是字符串t等于。

例子:
t = ab
h = aaabaab

s = a b $ a a a b a b b z = 0 0 0 1 1 2 0 1 2 0
i = 0 1 2 3 4 5 6 7 8 9

t.length()我们可以看到i = 5,这意味着我们找到了副本。现在为了防止重叠解决方案,我们现在跳过z[i] == t.length()字符t.length()

继续这将得到你的结果。