返回

算法挑战:字符唯一性判断

前端

判定字符唯一性是一道经典的算法题,也是程序员面试中经常遇到的问题。解决这一问题的方法有很多,本文将介绍两种最常用的算法:哈希表法和位向量法。

哈希表法

哈希表是一种数据结构,它可以将一个键值对存储起来,并允许用户通过键快速查找对应的值。我们可以利用哈希表来判断字符串中的字符是否唯一。具体方法如下:

  1. 初始化一个哈希表。
  2. 遍历字符串中的每个字符。
  3. 如果哈希表中已经存在该字符,则返回false。
  4. 否则,将该字符添加到哈希表中,并继续遍历下一个字符。
  5. 如果遍历完整个字符串,哈希表中没有重复的字符,则返回true。

哈希表法的优点是算法简单,易于实现。缺点是哈希表的存储空间与字符串的长度成正比,因此对于较长的字符串,哈希表法的效率会比较低。

位向量法

位向量是一种数据结构,它可以将一个集合中的元素存储起来,并允许用户通过元素的索引快速查找该元素是否存在于集合中。我们可以利用位向量来判断字符串中的字符是否唯一。具体方法如下:

  1. 初始化一个位向量,长度为256。
  2. 遍历字符串中的每个字符。
  3. 计算该字符在位向量中的索引。
  4. 如果位向量中该索引对应的位已经为1,则返回false。
  5. 否则,将位向量中该索引对应的位设置为1,并继续遍历下一个字符。
  6. 如果遍历完整个字符串,位向量中没有重复的位,则返回true。

位向量法的优点是存储空间与字符串的长度无关,因此对于较长的字符串,位向量法的效率会比较高。缺点是算法实现起来比较复杂。

算法比较

算法 存储空间 时间复杂度
哈希表法 O(n) O(n)
位向量法 O(1) O(n)

适用场景

  • 如果字符串的长度较短,则可以使用哈希表法。
  • 如果字符串的长度较长,则可以使用位向量法。

示例代码

import java.util.HashMap;

public class UniqueCharacter {

    public static boolean isUnique(String str) {
        // 哈希表法
        HashMap<Character, Integer> map = new HashMap<>();
        for (char c : str.toCharArray()) {
            if (map.containsKey(c)) {
                return false;
            }
            map.put(c, 1);
        }
        return true;
    }

    public static boolean isUnique2(String str) {
        // 位向量法
        int vector = 0;
        for (char c : str.toCharArray()) {
            int index = c - 'a';
            if ((vector & (1 << index)) != 0) {
                return false;
            }
            vector |= (1 << index);
        }
        return true;
    }

    public static void main(String[] args) {
        String str = "abcdef";
        System.out.println(isUnique(str)); // true
        System.out.println(isUnique2(str)); // true

        str = "abcadef";
        System.out.println(isUnique(str)); // false
        System.out.println(isUnique2(str)); // false
    }
}

结语

判定字符唯一性是一个经典的算法题,也是程序员面试中经常遇到的问题。本文介绍了两种最常用的算法:哈希表法和位向量法。读者可以根据自己的需要选择合适的算法来解决这个问题。