Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找两个给定字符之间的子字符串数_Java_String - Fatal编程技术网

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

Java 查找两个给定字符之间的子字符串数,java,string,Java,String,我的家庭作业需要编写一个方法,该方法得到两个参数,string和char,它需要返回以该char开头和以该char结尾的字符串数 示例: 对于字符串“abcbcabcab”和字符“c”,方法将返回6。 (子字符串为“cbc”、“cabc”、“cac”、“cbcabc”、“cabcac”、“cbcabcac”) 它需要尽可能有效,我能使用的唯一两种方法是charAt()和length()。这非常困难,经过3个小时的尝试,我想问你们是否有人能解决这个问题,或者至少给我一些线索。最简单的方法是你们应该

我的家庭作业需要编写一个方法,该方法得到两个参数,string和char,它需要返回以该char开头和以该char结尾的字符串数

示例: 对于字符串“abcbcabcab”和字符“c”,方法将返回6。 (子字符串为
“cbc”、“cabc”、“cac”、“cbcabc”、“cabcac”、“cbcabcac”


它需要尽可能有效,我能使用的唯一两种方法是
charAt()
length()
。这非常困难,经过3个小时的尝试,我想问你们是否有人能解决这个问题,或者至少给我一些线索。

最简单的方法是你们应该使用循环

在字符串中循环。检查当前字符串是否以给定字符开头,以给定字符结尾。如果它不跳到下一个。如果它只是循环一个从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 ++;

    }
  }
}
//字符串定义bla String[]myArray
整数计数=0;
对于(int i=0;i
这是个粗略的想法

我正在检查给定字符串是否以givenChar开头和结尾。 如果是这样的话,我会在字符串中重复检查givenChar。 如果它真的存在,我就数到1

我希望这能帮助你解决这个问题;)


祝你今天愉快

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

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;
long cnt=0;
对于(int i=0;i<(s.length()-1);i++)
如果(s.charAt(i)=c)
对于(int j=(i+1);j
此解决方案的复杂性为O(N^2)

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

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

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

让我们看看您目前的代码。到目前为止,我都是在纸上写的,因为我仍在尝试如何实现这一点。纸上代码从来都不是一个好主意,因为它没有编译器。在IDE中进行诚实的努力。@Avishay28这里没有人会做你的作业。请写下你的解决方案,贴在这里,人们会尝试给你更好的指导,或者在需要的时候提出改进建议。我写了一些伪代码,但没有什么真正实用的,我不是要求你帮我做作业,而是至少给我一些关于代码总体结构的线索。谢谢。什么是“myArray[]”?这是给定的字符串吗?该函数可能类似于公共(静态)int-myFunction(string[]myArray,char-givenChar),如果该函数需要是静态的,则可以添加标记,否则可以删除。myArray应该包含要检查的字符串,就像您在原始帖子中列出的字符串一样。但是函数应该获取字符串和字符,而不是数组。为什么要把它放在数组中?只给出了一个字符串..啊,对不起,我读了另一篇文章,我有点搞砸了xD。但是拉桑找到了一个很好的解决方案谢谢你的回答,你能解释一下“>>>1”是什么意思吗?@Avishay28被2除得更快,所以
>>1
可以替换为
/2