【leetcode】【java】【3、無重複字元的最長子串】
我的解法:
public int lengthOfLongestSubstring(String s) {
//先考慮邊界情況
if(s.length()==0) {
return 0;
}
if(s.length()==1) {
return 1;
}
//使用一個set記錄是否重複
Set<Character> set = new HashSet();
int res = 1;
for(int i=0;i<s.length();i++){
//包含s[i]的最長串的值
Character p = s.charAt(i);
set.add(p);
for(int j=i+1;j<s.length();j++){
Character q = s.charAt(j);
//如果重複,結束此次遍歷,i++,否則繼續向前遍歷,更新set集合與res
if(set.contains(q)){
set.clear();
break;
}else{
set.add(q);
res = Math.max(res, set.size());
}
}
}
return res;
}
大神的解法:
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max = 0;
int left = 0;
for(int i = 0; i < s.length(); i ++){
if(map.containsKey(s.charAt(i))){
//如果遇到重複值,左邊座標(從上一個位置)跳到該重複值的下一個位置
left = Math.max(left,map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i),i);
max = Math.max(max,i-left+1);
}
return max;
}
作者:powcai
連結:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
本質上都是滑動窗,但是大神的解法更加優雅,通過map的key記錄出現的字母,value位置資訊。
相關文章
- Java多執行緒
- MYSQL練習題:給定數字的頻率查詢中位數(Leetcode困難)
- Java的抽象類與介面理解
- 雜湊表的程式碼實現(Java)
- Java流
- centos8中快速搭建Java Web開發環境
- 10-Java內部類——成員內部類、區域性內部類、匿名內部類
- Java 虛擬機器垃圾收集機制詳解
- Java 物件記憶體分析
- leetcode - 正規表示式匹配
- 用連結串列的方式實現大數相減-Java實現
- 第四十一天學習java
- Golang學習刷Leetcode1
- TIOBE 11 月程式語言:Java 首次跌出前二,Python 勢不可擋齊齊哈爾
- 【Javascript】DOM程式設計學習總結篇
- Java語言程式設計與資料結構(基礎篇)課後複習題 第八章(四)
- Java繼承練習
- 瀏覽器中的JavaScript核心BOM(瀏覽器物件模型)重點掌握物件之Location物件的屬性與方法