LeetCode 算法:判定字符串是否唯一

144 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 1 天,点击查看活动详情

判定字符是否唯一

原题地址

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s = "leetcode"
输出: false 

示例 2:

输入: s = "abc"
输出: true

限制:

  • 0 <= len(s) <= 100
  • 如果你不使用额外的数据结构,会很加分。

思路分析

方法一

  1. 方法一依旧是很粗暴的方法;
  2. 定义一个 obj 以字符串中的字符为 keytruevalue 的对象;
  3. 遍历字符串,判断 obj[astr[i]],若为 true,则表示有重复的字母, 直接 return false 即可。否则,将 obj[astr[i]] 设置为 true
  4. 到最后 return true

方法二

  1. 使用 ES6set 对象给字符串进行去重;
  2. 若有重复的字母,则去重后的长度会比原先字符串的长度减小;
  3. 返回去重后的长度是否与原字符串的长度是否相同。

方法三

  1. 若字符串中的某个字符是唯一的,那么它在字符串中的位置也一定是唯一的;
  2. 比较字符串中的字符第一次出现的位置和最后一次出现的位置是否相同即可;
  3. indexOf 可以找到字符第一次出现的位置,lastIndexOf 可以找到字符最后一次出现的位置。

AC 代码

方法一

/**
 * @param {string} astr
 * @return {boolean}
 */
var isUnique = function(astr) {
    const obj = {}
    for(let i = 0; i < astr.length; i++) {
        if(obj[astr[i]]) {
            return false
        } 
        obj[astr[i]] = true
    }
    return true
};

结果:

  • 执行结果: 通过
  • 执行用时:64 ms, 在所有 JavaScript 提交中击败了29.99%的用户
  • 内存消耗:40.8 MB, 在所有 JavaScript 提交中击败了55.59%的用户
  • 通过测试用例:17 / 17

方法二

/**
 * @param {string} astr
 * @return {boolean}
 */
var isUnique = function(astr) {
    return new Set(astr).size === astr.length
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了56.79%的用户
  • 内存消耗:40.8 MB, 在所有 JavaScript 提交中击败了66.74%的用户
  • 通过测试用例:17 / 17

方法三

/**
 * @param {string} astr
 * @return {boolean}
 */
var isUnique = function(astr) {
    for(let i = 0; i < astr.length; i++) {
        if(astr.indexOf(astr[i]) !== astr.lastIndexOf(astr[i])) {
            return false
        }
    }
    return true
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了56.79%的用户
  • 内存消耗:40.8 MB, 在所有 JavaScript 提交中击败了62.40%的用户
  • 通过测试用例:17 / 17

END