摘要:电信天翼云前端笔试算法题,在牛客上做的题目;总共三道算法题,第一道比较简单,括号匹配;第二道求无重复字符的最长子串长度;第三道将数字转换为罗马数字;三道都是原题,刷过的话问题不大。这里讲一下无重复字符的最长子串题目,该题是个中等难度题。
题一:给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
if (s.length % 2 != 0) return false;
//用栈 栈为空先入栈 栈不为空 判断当前元素与栈顶元素是否匹配 匹配则一起出栈;否则入栈;
const arr = [];
for (item of s) {
if (arr.length == 0) {
arr.push(item)
} else {
let temp = arr.pop()
switch (item) {
case ')':
if (temp != '(') {
//不匹配都入栈
arr.push(temp); arr.push(item);
}
break;
case '}':
if (temp != '{') {
//不匹配都入栈
arr.push(temp); arr.push(item);
}
break;
case ']':
if (temp != '[') {
//不匹配都入栈
arr.push(temp); arr.push(item);
}
break;
default:
//不匹配都入栈
arr.push(temp); arr.push(item);
}
}
}
return !arr.length;
};
题二:给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
一开始思路:想着暴力解法,直接用双指针的方式;发现超时;
后来正确思路:借助set集合+双指针的解法;set集合用于记录每个可能的连续子串,且该集合是动态更新的。那么最长子串长度就是该集合的记录的子串长度,即set.size:
代码如下:
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
if (s.length == 0) return 0;
let max = 0, j = 0;
let set = new Set(); //记录每个科能的子串,是动态更新的
for (let i = 0; i < s.length; i++) {
if (!set.has(s[i])) {
set.add(s[i])
max = Math.max(max, set.size)
} else {
while (set.has(s[i])) {
set.delete(s[j])
j++;
}
set.add(s[i])
}
}
return max;
};
运行结果:
总结一下:
时间复杂度O(n);空间复杂度O(n);
这样做的缺点就算空间复杂度太高;