今天面试有两个面试题,记录一下
题目一 最长回文子串
// 最短回文串
// 中心扩散法
// 输入一个字符串:如 babad
// return: 最大的回文子串 => bab
function f(s){
let len = s.length;
// a b单个字符也是回文
if(len < 2) return s;
function getMax(l, r){
while(l >=0 && r < len && s[l] === s[r]){
l --;
r ++;
}
return {
l: l + 1,
r: r - 1
}; // 最后满足条件还l--和r++了
}
let start = 0, end = 0;
for(let i = 0; i < len; i ++){
let obj1 = getMax(i, i); // aba类型
let obj2 = getMax(i, i+1); // abba类型
let maxObj = obj1.r - obj1.l > obj2.r - obj2.l ? obj1: obj2;
if(maxObj.r - maxObj.l > end - start){
start = maxObj.l;
end = maxObj.r;
}
}
return s.slice(start, end+1);
}
const s = "cbbd";
const res = f(s);
console.log(res);
几个注意点:回文类型 aba 和 abba类型都计算一遍即可,从中心扩展
2 绝对路径
// 用栈
// 输入: 一个包含.. 和. 的相对路径
// 输出: 一个绝对路径
function f(s){
const stk = [];
// 先分割为数组
const arr = s.split("/")
// console.log(arr);
// console.log(arr);
//入栈
for(let i = 0; i < arr.length; i ++){
if(arr[i] === '..') stk.pop(); // 出栈一个路径
else if(arr[i] === '.' || arr[i] === '') continue;
else stk.push(arr[i]);
}
// console.log(stk);
if(stk.length === 0) return '/'
//
let res = '/';
res += stk.join('/');
return res;
}
// const s = 'a/b/c/.././' /a/b
// const s = 'a/../../..' '/
const s = '/A/B/../C/D/../E'
const res = f(s)
console.log(res);
这个题,面试写的是dp,但是额外开了一个dp数组,面试官提醒可以用stack来做,入栈出栈即可完成模拟了