字符串索引超出范围:-1 循环错误
String index out of range: -1 error with loops
我检查了有关此问题的旧主题,但无法解决。
此方法用于比较两个字符串,如果第一个字符串的每个 letter/character 都在第二个字符串中找到(不一定反之亦然),则该方法应该 return "true"(即使第二个字符串有多余的字母)。
我的想法是检查第一个字符串的每个索引处的字母,看看它是否在第二个字符串中,如果是,则删除两个字符串中的那个字母。当第一个字符串用完字母(长度等于零)时,布尔值应该 return true.
我认为我的循环或子字符串在某些时候超出了范围。
public boolean isFound(String first, String second) {
StringBuilder sb1 = new StringBuilder(first);
StringBuilder sb2 = new StringBuilder(second);
first.toCharArray();
second.toCharArray();
for (int i = 0; i < first.length(); i++) {
int k = (first.substring(i, i + 1)).indexOf(second, i);
if (sb1.length() > 0) {
sb1.deleteCharAt(k);
sb2.deleteCharAt(k);
}
}
if (sb1.length() == 0) {
return true;
} else {
return false;
}
}
例如:"at" 和 "tack" 应该 return 为真,"tree" 和 "ere" 应该 return 为假。
编辑
查看评论后,我的新代码现在是这样的。它总是 return 是错误的,即使 "tree" 和 "tree" 也是如此。
public boolean isFound(String first, String second){
StringBuilder sb2 = new StringBuilder(second);
for(int i=0;i<first.length();i++){
int k = sb2.indexOf(first,i);
if (k==-1)
return false;
else sb2.deleteCharAt(k);
}
return true;
}
请检查您的算法和 API 的 code/usage
` first.toCharArray();`
second.toCharArray();
不会将 first,second 转换为数组,这个 API 会 return 一个字符数组。
(first.substring(i,i+1)).indexOf(second,i);
将搜索 first.substring 中的整个子字符串 2。
审查 algo/code 更正此 accordingly.please 处理所有 edge/corner 案例。
理想的方法是使用散列图。(额外费用 space)
你的代码有很多问题。
- 您只需要一个 StringBuilder 版本,
second
- 对
toCharArray()
的调用是多余的
- 您不应在
second
中搜索 first
的每个字符,而应在它的可变版本 sb2
. 中搜索
- 您使用的
indexOf
有误。应该在 StringBuilder
对象上调用此方法来搜索第一个参数,你已经交换了它。
你可以使用的伪代码是
isSuperAnagram(String first, String second) {
sb = StringBuilder(second)
for all chars in first {
k = search index of current char of first in sb
if(k == -1) // char is not in sb
return false
else
remove char at index k from sb
}
return true
}
您可以在代码中实现简单的逻辑
for(int i=0;i<sb1.length;i++)
{
for(int j=0;j<sb2.length;j++)
{
if(sb1.[i]==sb2.[j])
{
count++;
break;
}
if(count>=sb1.length)
{
System.out.print("match");
}
}
}
如果你想要更多条件,那么 post 它在我下面 post 我写的只是你的后续例子
例如:"at" 和 "tack" 应该 return true,"tree" 和 "ere" 应该 return false。
我检查了有关此问题的旧主题,但无法解决。
此方法用于比较两个字符串,如果第一个字符串的每个 letter/character 都在第二个字符串中找到(不一定反之亦然),则该方法应该 return "true"(即使第二个字符串有多余的字母)。
我的想法是检查第一个字符串的每个索引处的字母,看看它是否在第二个字符串中,如果是,则删除两个字符串中的那个字母。当第一个字符串用完字母(长度等于零)时,布尔值应该 return true.
我认为我的循环或子字符串在某些时候超出了范围。
public boolean isFound(String first, String second) {
StringBuilder sb1 = new StringBuilder(first);
StringBuilder sb2 = new StringBuilder(second);
first.toCharArray();
second.toCharArray();
for (int i = 0; i < first.length(); i++) {
int k = (first.substring(i, i + 1)).indexOf(second, i);
if (sb1.length() > 0) {
sb1.deleteCharAt(k);
sb2.deleteCharAt(k);
}
}
if (sb1.length() == 0) {
return true;
} else {
return false;
}
}
例如:"at" 和 "tack" 应该 return 为真,"tree" 和 "ere" 应该 return 为假。
编辑 查看评论后,我的新代码现在是这样的。它总是 return 是错误的,即使 "tree" 和 "tree" 也是如此。
public boolean isFound(String first, String second){
StringBuilder sb2 = new StringBuilder(second);
for(int i=0;i<first.length();i++){
int k = sb2.indexOf(first,i);
if (k==-1)
return false;
else sb2.deleteCharAt(k);
}
return true;
}
请检查您的算法和 API 的 code/usage
` first.toCharArray();`
second.toCharArray();
不会将 first,second 转换为数组,这个 API 会 return 一个字符数组。
(first.substring(i,i+1)).indexOf(second,i);
将搜索 first.substring 中的整个子字符串 2。
审查 algo/code 更正此 accordingly.please 处理所有 edge/corner 案例。
理想的方法是使用散列图。(额外费用 space)
你的代码有很多问题。
- 您只需要一个 StringBuilder 版本,
second
- 对
toCharArray()
的调用是多余的 - 您不应在
second
中搜索first
的每个字符,而应在它的可变版本sb2
. 中搜索
- 您使用的
indexOf
有误。应该在StringBuilder
对象上调用此方法来搜索第一个参数,你已经交换了它。
你可以使用的伪代码是
isSuperAnagram(String first, String second) {
sb = StringBuilder(second)
for all chars in first {
k = search index of current char of first in sb
if(k == -1) // char is not in sb
return false
else
remove char at index k from sb
}
return true
}
您可以在代码中实现简单的逻辑
for(int i=0;i<sb1.length;i++)
{
for(int j=0;j<sb2.length;j++)
{
if(sb1.[i]==sb2.[j])
{
count++;
break;
}
if(count>=sb1.length)
{
System.out.print("match");
}
}
}
如果你想要更多条件,那么 post 它在我下面 post 我写的只是你的后续例子 例如:"at" 和 "tack" 应该 return true,"tree" 和 "ere" 应该 return false。