字符串中的第一个唯一字符
代码
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 之外的
双指针 一个指针从前向后 一个从后向前