1. LeetCode题号3
题目内容:给定一个字符串,寻找没有字符重复的最长子字符串。
1. 初始方法:
-
简单粗暴check所有满足条件的Substring——内部没有重复字符(Character),并且持续更新最长Substring长度。
(用同一个maxLen记录最长字符串(从i = 0更新到i = len - 1))
for (i = 0; i < len; i++){
for (j = i, j <= len; j++){
}
} -
public boolean inoOrNot()
// check whether all the Characters in this Substring s is UNIQUE -
使用了Set API;
-
Substring [i, j]:check s.charAt(k) :
if(set.add(s.charAt(k)))遇到重复的了,立刻返回false;
否则,set.add(s.charAt(k)) - 加入这个没重复的,并且继续往下一个查找 k++, 直到k = j -
注意:
j <= len && k < j
|| j < len && k <= j
原因: // j <= len for i = len-1, s.charAt(len-1),
// if the longest substring only contains one char
// the length (j - i) should be 1;
// therefore, j should be able to reach len -
Hash Set 和 Hash Map?
总结
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = s.length();
// Set<Character> aSet = New HashSet<>();
int maxLen = 0;
// String a = new String("");
// String b = new String("");
// How to check every character in a String?
// and do some comparisons, merge, or reorder?
for(int i = 0 ; i< len; i++){
for (int j = i + 1; j <= len; j++){
// j <= len for i = **len-1**, s.charAt(**len-1**),
// if the longest substring only contains one char
// the length (j - i) should be 1;
// therefore, j should be able to reach len
if(inOrNot(s, i, j)){
maxLen = Math.max(maxLen, j-i);
}
}
// Character temp = s.charAt(i)
// if(!aSet.contains(temp)){
// aSet.add(temp);
// }else{}
}
return maxLen;
}
public boolean inOrNot(String s, int start, int end) {
Set<Character> set = new HashSet<>();
for (int k = start; k < end; k++){
Character ch = s.charAt(k);
if (set.contains(ch)){
return false;
} else {
set.add(ch);
}
}
return true;
}
}
上面方法“Time Limit Exceeded”。
2. 优化:
- Solution提到了Slide Window的方法。
遇到相同的字符,起点➕1,终点➕1. (窗口整体向后滑动一格。)
LeetCode题号5
题目内容:给定一个字符串,寻找最长的回文字子符串。
LeetCode题号14
题目内容:给定一个数组,数组中储存的元素为字符串,寻找这些字符串最长公共前缀。
本期会公布题号13的答案,接下去会慢慢更新,请大家多多支持。
网友评论