字符串索引超出范围:-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。