【问题标题】:Find if a string is unique or not查找字符串是否唯一
【发布时间】:2014-06-27 21:27:10
【问题描述】:

我想使用哈希表来查找唯一字符,因为它对我来说似乎更有效,例如,哈希表中的 hello 将是=> {h:1,e:1,l:2,o:1} & since value大于 1 则字符串不是唯一的。我知道我可以用 ascii 方式计算唯一字符,但我想实现 hashtable 方式。

请注意,我不想要正则表达式实现。

static void findHashUnique(String str)
{
    Hashtable<Character, Integer> ht = new Hashtable<Character, Integer>();
    for(int i=0;i<str.length();i++)
    {
        int cnt=1;

        if(!ht.containsKey(str.charAt(i)))
        {
            ht.put(str.charAt(i), cnt);
        }
    }
    System.out.print(ht);
}

我被困在如何首先初始化哈希表并检查值是否存在然后递增的部分。在 'l' 的情况下,它将递增到 2 而不是 1,因为键是相同的。 还有这个解决方案有效吗?

【问题讨论】:

  • 只需使用 HashSet(它使用 Hashtable,但那又怎样)。
  • HashSet 删除重复项.. 我为什么要使用它?

标签: java string hashtable


【解决方案1】:

这是我的方法。

String string = "hello";
Hashtable<Character, Integer> map = new Hashtable<>();
for (int i = 0; i < string.length(); i++) {
   char c = string.charAt(i);
   if (map.containsKey(c)) {
      map.put(c, map.get(c) + 1);
   } else {
      map.put(c, 1);
   }
}
System.out.println(map);

输出:{e=1, o=1, l=2, h=1}

【讨论】:

  • 这是二次时间.. 不可能在 O(n) 中
  • @fscore 我不这么认为,基于比较的次数。你必须有线性时间和Hashmap吗?
  • @fscore 知识就是力量:stackoverflow.com/questions/40471/…
  • @fscore 你读过堆栈溢出链接吗?正如它所说的那样,您在此方法中没有要处理的同步。所以你应该使用HashMap,因为它性能更好(不必处理同步问题)。
【解决方案2】:

好吧,我不知道您将要检查哪些字符编码,但如果您将自己限制为仅使用 ASCII 字符,则可以使用 128 个元素的简单数组。

public static String uniqueLetters(String s) {
   // storage for ascii characters
   char[] letters = new char[128];

   // mark counts of all letters
   for(int i = 0; i < s.length(); i++) {
      letters[ (int)s.charAt(i) ]++;
   }

   // find unique letters
   String uniques = "";
   for(int i = 0; i < letters.length; i++) {
      if ( letters[i] == 1 ) {
         uniques += Character.toString( (char)letters[i] );
      }
   }

   return uniques;
}

【讨论】:

  • +1 我有基本相同的想法,但由于您在我之前 1 分钟发布它,所以将其删除 =)
【解决方案3】:

要“修复”您的代码,请使用HashSet&lt;Character&gt;,它在内部使用Hashtable,但您不必知道或担心这一点。只需继续将字符添加到集合中,最后您将得到一组独特的字符。

为了更容易实现意图

String uniqueChars = str.replaceAll("(.)(?=.*\\1)", "");

【讨论】:

  • 很确定他想要对每个字符进行计数。
  • 我想通过计算每个字符来判断一个字符串是否唯一
  • @fscore 正则表达式匹配稍后在输入中再次出现的字符,通过向前查找来断言对捕获的字符的反向引用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2013-05-16
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多