「abcabcbb」を指定すると、答えは「abc」で、長さは 3 です。
「bbbbb」を指定すると、答えは長さ 1 の「b」になります。
「pwwkew」を指定すると、答えは「wke」で、長さは 3 です。答えは部分文字列でなければならないことに注意してください。「pwke」は部分文字列ではなく部分列です。
機能するソリューションを思いつきましたが、いくつかのテストケースで失敗しました。その後、より良い解決策を見つけ、それを書き直して理解しようとしました。以下の解決策は問題なく動作しますが、この問題と約 2 時間格闘した後でも、この特定のコード行が機能する理由を理解できません。
import java.util.*;
import java.math.*;
public class Solution {
public int lengthOfLongestSubstring(String str) {
if(str.length() == 0)
return 0;
HashMap<Character,Integer> map = new HashMap<>();
int startingIndexOfLongestSubstring = 0;
int max = 0;
for(int i = 0; i < str.length(); i++){
char currentChar = str.charAt(i);
if(map.containsKey(currentChar))
startingIndexOfLongestSubstring = Math.max(startingIndexOfLongestSubstring, map.get(currentChar) + 1);
map.put(currentChar, i);
max = Math.max(max, i - startingIndexOfLongestSubstring + 1);
}//End of loop
return max;
}
}
問題の行は
max = Math.max(max, i - startingIndexOfLongestSubstring + 1);
なぜこれが機能するのかわかりません。以前の最大値の間の最大値と、現在のインデックスと現在最も長い部分文字列の開始インデックスとの差を取り、1 を追加しています。コードが現在のインデックスとの差を取得していることはわかっています。 startingIndexOfSubstringですが、意図した結果が得られる理由を概念化できません。特になぜそれが機能するのか、誰かが私にこのステップを説明してもらえますか?