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