Учитывая «abcabcbb», ответ «а», который длина 3.Длина самой длинной общей подстроки без повторяющихся символов
Учитывая «BBBBB», ответ «б», с длина 1.
Учитывая «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. Я знаю, что код получает разницу между нашим текущим индексом и startIndexOfSubstring, но я не могу концептуализировать ПОЧЕМУ он работает, чтобы дать нам предполагаемый результат; Может кто-нибудь, пожалуйста, объясните мне этот шаг, особенно ПОЧЕМУ он работает?
Можете ли вы вставить то, что вы подразумеваете под самой длинной подстрокой, чтобы лучше понять вопрос. С примером и выходом? –
@BandiKishore да, извините. –