查找两个给出字符之间的子字符串数

时间:2016-01-13 19:00:06

标签: java string

我需要我的作业来编写获取两个参数的方法,字符串和字符,并且它需要返回以该字符串开头并以该字符结尾的字符串数。

示例: 对于字符串"abcbcabcacab"和char'c',该方法将返回6。 (子字符串为"cbc", "cabc", "cac", "cbcabc", "cabcac", "cbcabcac"

它需要尽可能高效,我可以使用的唯一两种方法是charAt()length()。这很难得到地狱,经过3个小时的尝试,我问你们,如果有人解决这个问题,或者至少给我一些线索。

2 个答案:

答案 0 :(得分:2)

显而易见的解决方案是检查输入字符串中的每个符号,如果等于指定的char,则尝试查找所有可能的子字符串,从这一点开始,如下所示:

long cnt = 0;
for (int i = 0; i < (s.length() - 1); i++)
    if (s.charAt(i) == c)
        for (int j = (i + 1); j < s.length(); j++)
            if (s.charAt(j) == c)
                cnt++;
return cnt;

该解决方案具有复杂度O(N ^ 2)

但是,子串的数量实际上由字符串中char的出现次数决定,这似乎是Triangular number

因此,优化的O(N)解决方案是:

long cnt = -1;
for (int i = 0; i < s.length(); i++)
    if (s.charAt(i) == c)
        cnt++;
return (cnt * (cnt + 1)) >>> 1;

答案 1 :(得分:0)

最简单的是你应该使用一个循环。

遍历字符串。检查当前字符串是否以给定的char开头并以给定的char结束。如果它没有跳转到下一个。如果它只是从1到长度减去第二个最后一个字符的计数器循环。

你将通过踢出无效的字符串来减少时间,你将检查2个字符减去每个字符串;) 我想这是一个非常快的方式。

实施例

// String definition bla String[] myArray
int count = 0;
for(int i = 0; i < myArray.length(); i++) {

  if(myArray[i].charAt(0) == givenChar && myArray[i].charAt(myArray.length()-1)) {

    for(int j = 1; j < myArray.length()-2;j++) {

      if(myArray[i].charAt(j) == givenChar) 
        count ++;

    }
  }
}

这是个粗略的想法。

我正在检查给定的String是否以givenChar开始和结束。 如果它迭代通过字符串再次检查givenChar。 如果确实存在,我计算1。

我希望这可以帮助你;)

度过美好的一天!