2020/05/24
はじめに
与えられたs
の内部で、文字が重複しない最大のsubstringを探し、その長さを求める問題.
スライディングウィンドウとハッシュテーブルを活用して解いた。
コード全体
int lengthOfLongestSubstring(string s) {
int maxLength = 0;
map<char,int> chars;
for(size_t left=0, right=0; right<s.length(); right++){
chars[s[right]]++;
while(left<right && chars[s[right]]>1) chars[s[left++]]--;
if( maxLength < right-left+1 ) maxLength = right-left+1;
}
return maxLength;
}
解説
maxLength
は、最大長を格納して更新していく。
chars
は、各文字がsubstringに何個含まれているかを記憶する。
int lengthOfLongestSubstring(string s) {
int maxLength = 0;
map<char,int> chars;
left
はsubstringの左端を、right
は、substringの右端のインデックス番号を指す。
right
を更新するごとにchars
に含有文字数を足していく。
for(size_t left=0, right=0; right<s.length(); right++){
chars[s[right]]++;
right
の文字が重複している場合、重複が解消されるまでleft
を動かす。
while(left<right && chars[s[right]]>1) chars[s[left++]]--;
left
・right
に対するsubstringの長さはright-left+1
であり、maxLength
を更新する。
if( maxLength < right-left+1 ) maxLength = right-left+1;
}
maxLength
を返す。
return maxLength;
}