ノーインタビューでそこに遭遇するまで、文字列の長さは、最長の部分文字列を取得するために繰り返して打ちます。その後leetcodeも、このトピックのタイトルに見られました。今、何が問題解決の方法やアイデアだっ記録しました。
1.問題解決のアイデア
最初に考えたのは、それらを維持するために、そして最終的に文字列の長さを比較するために、最大の長さを描く部分文字列を繰り返されることはありません。そして、このメンテナンスの実現で見つかっ行うことは良くありませんので、部分文字列の長さを記録するために、この時点で表示され、重複する文字がある場合、別のアイデアの考えは、レコードの長さは、ほとんどの最終的な出力文字繰り返しではありませんサブの長い長さに。
2.実装コード
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
// 空字符串直接返回0
if (!s) { return 0 };
const map = new Map();
// 结果值
let result = 0;
// 出现重复字符时,此前的长度值
let dupLength = 0;
const { max } = Math;
for (let i = 0;i < s.length;i++) {
const word = s[i];
if (map.has(word)) {
// 获取重复字符出现时已存的长度
// 此处为何取其中的较大值:
// 因为如果再次出现的重复字符get的长度比dupLength更小
// 即在这两个重复字符之间还存在其他重复字符
dupLength = max(map.get(word), dupLength);
}
// 更新结果值
result = max(result, i - dupLength + 1);
// 更新此字符所代表的长度值
map.set(word, i + 1);
}
return result;
};