如何在java中优化两个for循环(for循环中的for循环)

时间:2012-02-17 05:42:47

标签: java

我有以下问题:

  • 我有一个很长的字符串String str = "abcdefghiart----"
  • 现在我想迭代字符串,想要找到字符串
  • 中的第一个重复字符
  • 这可以通过应用两个for循环来搜索第一个重复
  • 来实现
  • 这种方法工作正常,但如果字符串非常大且只有最后两个字符重复,则迭代复杂度会非常高

    现在我希望最小化复杂性并优化此代码。我也可以使用foreach循环来迭代,但它仍然是两个foreach循环。我不想使用任何系统库。有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:3)

BitSet seenCharacters = new BitSet();
for(int i=0;i<str.length(); i++) {
  if(seenCharacters.get(str.charAt(i))) {
    return str.charAt(i); // duplicate
  }
  seenCharacters.set(i);
}

......直截了当,没有?

答案 1 :(得分:2)

我会用不同的解决方案解决问题。我会使用一个hashmap(或任何衍生词),键是一个字符,值为null。

然后我会遍历字符串,一次得到一个字符,对于我得到的每个字符,我将尝试在hashmap中插入一个条目。如果我没有插入它,那么我知道字符(这是键本身)是重复的。

答案 2 :(得分:1)

这是一种在字符串中查找第一个重复字符的方法。

 public static String findFirstDuplicate(String string){

                 for(int i=0;i<string.length()-1; i++){
                     String c=string.charAt(i)+"";
                     if(string.indexOf(c, i+1)>-1)
                         return  c;
                 }

                 return null;
  }

用于优化的AS,您可以通过自定义合并排序来查找重复值并在找到重复项时终止来优化它。这里解释起来有点复杂,但在最坏的情况下,您将能够使用修改后的合并排序算法在O(nlogn)中找到第一个副本。

答案 3 :(得分:0)

定义一个大小为[26]的int数组,每个字母表有一个插槽

遍历字符串并对每个字母表检查插槽的值是否为&gt; 0如果是,那么对应于槽的字母表是重复字符,如果它是0,只需增加它并继续前进