字符串常考察的算法
5. 最长回文子串
5. 最长回文子串
var longestPalindrome = function(s) {
if (s.length === 1) return s;
let maxRes = 0, maxStr = '';
for (let i = 0; i < s.length; i++) {
let str1 = palindrome(s, i, i);
let str2 = palindrome(s, i, i + 1);
if (str1.length > maxRes) {
maxStr = str1;
maxRes = str1.length;
}
if (str2.length > maxRes) {
maxStr = str2;
maxRes = str2.length;
}
}
return maxStr;
};
function palindrome(s, l, r) {
while (l >= 0 && r < s.length && s[l] === s[r]) {
l--;
r++;
}
return s.slice(l + 1, r);
}
6. Z 字形变换
6. Z 字形变换
var convert = function(s, numRows) {
const n = s.length, r = numRows;
if (r === 1 || r >= n) {
return s;
}
const t = r * 2 - 2;
const ans = [];
for (let i = 0; i < r; i++) {
for (let j = 0; j < n - i; j += t) {
ans.push(s[j + i]);
if (0 < i && i < r - 1 && j + t - i < n) {
ans.push(s[j + t - i]);
}
}
}
return ans.join('');
};
13. 罗马数字转整数
13. 罗马数字转整数
var romanToInt = function(s) {
const symbolValues = new Map();
symbolValues.set('I', 1);
symbolValues.set('V', 5);
symbolValues.set('X', 10);
symbolValues.set('L', 50);
symbolValues.set('C', 100);
symbolValues.set('D', 500);
symbolValues.set('M', 1000);
let res = 0;
const n = s.length;
for (let i = 0; i < n; ++i) {
const value = symbolValues.get(s[i]);
if (i < n - 1 && value < symbolValues.get(s[i + 1])) {
res -= value;
} else {
res += value;
}
}
return res;
};
415. 字符串相加
415. 字符串相加
var addStrings = function(a, b) {
let i = a.length,j = b.length;
let len = i - j;
let sum,sumArr = [];
if(len > 0){
b = b.padStart(i, '0');
}else if(len<0){
a = a.padStart(j, '0');
i = j;
}
let aArr = a.split('').reverse(), bArr = b.split('').reverse();
for(let m = 0;m < i;m++){
let c = parseInt(aArr[m])+parseInt(bArr[m]) + (sumArr[m] || 0);
if(c > 9){
sumArr[m] = c%10;
sumArr[m+1] = parseInt(sumArr[m+1] || 0)+1;
}else{
sumArr[m] = c;
}
}
sum = sumArr.reverse().join('');
return sum;
};
28. 实现 strStr()
28. 实现 strStr()
var strStr = function(haystack, needle) {
const n = haystack.length, m = needle.length;
for (let i = 0; i + m <= n; i++) {
let flag = true;
for (let j = 0; j < m; j++) {
if (haystack[i + j] != needle[j]) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
return -1;
};
58. 最后一个单词的长度
58. 最后一个单词的长度
var lengthOfLastWord = function(s) {
let index = s.length - 1;
while (s[index] == ' ') {
index--;
}
let res = 0;
while (s[index] !== ' ' && index >=0) {
res++;
index--;
}
return res;
};
67. 二进制求和
67. 二进制求和
var addBinary = function(a, b) {
const arr1 = a.split('');
const arr2 = b.split('');
let res = [];
let jinwei = 0;
while(arr1.length || arr2.length) {
let num1 = Number(arr1.pop()) || 0;
let num2 = Number(arr2.pop()) || 0;
let sum = num1 + num2 + jinwei;
console.log(sum)
if (sum > 1) {
jinwei = 1;
sum = sum % 2;
} else {
jinwei = 0;
}
res.unshift(sum);
}
jinwei && res.unshift(1);
return res.join('');
};
125. 验证回文串
125. 验证回文串
var isPalindrome = function(s) {
const newStr = s.replace(/[^a-zA-Z0-9]/g, '').toLocaleLowerCase();
for(let i = 0; i < Math.floor(newStr.length / 2); i++ ){
if(newStr[i] !== newStr[newStr.length - i - 1]) {
return false
}
}
return true;
};
168. Excel表列名称
168. Excel表列名称
var convertToTitle = function(columnNumber) {
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
let returnStr = ''
let num = n
let rem
let arr = []
while(num > 0) {
num -= 1
rem = num%26
arr.push(rem)
num = Math.floor(num/26)
}
while(arr.length!==0){
returnStr += str[arr.pop()]
}
return returnStr;
};
171. Excel 表列序号
171. Excel 表列序号
var titleToNumber = function(columnTitle) {
let number = 0;
let multiple = 1;
for (let i = columnTitle.length - 1; i >= 0; i--) {
const k = columnTitle[i].charCodeAt() - 'A'.charCodeAt() + 1;
number += k * multiple;
multiple *= 26;
}
return number;
};
190. 颠倒二进制位
190. 颠倒二进制位
var reverseBits = function(n) {
let rev = 0;
for (let i = 0; i < 32 && n > 0; ++i) {
rev |= (n & 1) << (31 - i);
n >>>= 1;
}
return rev >>> 0;
};
191. 位1的个数
191. 位1的个数
var hammingWeight = function(n) {
};
205. 同构字符串
205. 同构字符串
var isIsomorphic = function(s, t) {
};