leetcode题解-字符串中的第一个唯一字符 & 有效的字母异位词 & 验证回文字符串

字符串中的第一个唯一字符

代码

var firstUniqChar = function(s) {
    
    
    let map = {
    
    };
    let t = [];
    for(let i=0,l=s.length;i<l;i++){
    
    
     if(map[s[i]]===undefined){
    
    
            map[s[i]] =t.length;
            t.push(i);
        }else{
    
    
            t[map[s[i]]] = null;
        }
    }
    for(let i=0,l=t.length;i<l;i++){
    
    
        if(t[i]!=null){
    
    
            return t[i]
        }   
    }
    return -1
};

思路

利用map表
key 值代表 字母
value 存放该字母的位置
一个辅助数组t
如果字母不在map表中 把位置push到t[]中 如果map中存在 把t中对应位置设置为null
最后只要找 辅助数组 t中第一个不为null的数字 就是所求位置

有效的字母异位词

代码

var isAnagram = function(s, t) {
    
    
    if(s.length!==t.length){
    
    
       return false
    }
    if(s===t){
    
    
        return true
    }
    let l = s.length;
    let map1 = {
    
    };
    let map2 = {
    
    };
    for(let i = 0;i<l;i++){
    
    
        if(!map1[s[i]]){
    
    
            map1[s[i]] =1 
        }else{
    
    
            map1[s[i]] +=1
        }
        if(!map2[t[i]]){
    
    
            map2[t[i]] =1 
        }else{
    
    
            map2[t[i]] +=1 
        }
    }
    for (let item in map1){
    
    
        if(!map2[item]||map1[item]!=map2[item]){
    
    
            return false
        }
    }
    return true
};

思路

利用map 字母一个只有26个。先把两个字符串分别映射到map表中
只要判断两个map表是否相同
最大次数 l*2+26次

验证回文字符串

代码

var isPalindrome = function(s) {
    
    
  s = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase();
  let l = 0, r = s.length - 1;
  while (l < r) {
    
    
    if (s[l]!==s[r]) {
    
    
      return false
    }
    l++
    r--
  }
  return true
};

思路

[^0-9a-zA-Z] 负值正则 意思是 除0-9a-zA-Z 之外的
双指针 一个指针从前向后 一个从后向前

猜你喜欢

转载自blog.csdn.net/weixin_38616850/article/details/106505846