日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode-3-无重复字符的最长子串

發布時間:2024/9/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode-3-无重复字符的最长子串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

?

暴力解法:枚舉出所有的子字符串,再根據子字符串來判斷,使用枚舉用了三層循環,時間復雜度為O(N2)

package com.example.demo;import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set;public class TestLeetCode {/*** 查找給定字符串中長度最長的子字符串的長度(本題不需要給出具體的字符串)** @param args*/public static void main(String[] args) {int abcabcbb = lengthOfLongestSubstring("abcabcbb");System.out.println(abcabcbb);}/*** 暴力解法,枚舉出所有的子字符串,并且子字符串無重復字符,找到長度最長的子字符串** @param s* @return*/public static int lengthOfLongestSubstring(String s) {int maxRes = 0;int len = s.length();for (int i = 0; i < len; i++) {for (int j = i + 1; j <= len; j++) {System.out.println(s.substring(i, j));
         //如果子字符串沒有重復字符,則重新計算maxRes  
if (allUnique(s, i, j)) {maxRes = Math.max(maxRes, j - i);}}}return maxRes;}/*** 判斷i-j之間的字符串是否是沒有重復的字符*/private static boolean allUnique(String s, int start, int end) {Set<Character> contains = new HashSet<>();for (int i = start; i < end; i++) {char c = s.charAt(i);if (contains.contains(c)) {return false;}contains.add(c);}return true;}/*** 枚舉出的所有子字符串* a* ab* abc* abca* abcab* abcabc* abcabcb* abcabcbb* b* bc* bca* bcab* bcabc* bcabcb* bcabcbb* c* ca* cab* cabc* cabcb* cabcbb* a* ab* abc* abcb* abcbb* b* bc* bcb* bcbb* c* cb* cbb* b* bb* b*/ }

?

滑動窗口法:

package com.example.demo;import java.util.HashSet; import java.util.Set;public class TestLeetCode {/*** 查找給定字符串中長度最長的子字符串的長度(本題不需要給出具體的字符串)** @param args*/public static void main(String[] args) {int abcabcbb = lengthOfLongestSubstring("abcabcbb");System.out.println(abcabcbb);}/*** 滑動窗口法,通常情況下在數組和字符串中經常用到* 該方式會定義兩個索引,left = 0; right = 0; 開始時,left = right,此時left到right之間沒有重復的字符,* 此時right++,然后在判斷left到right之間是否有重復字符,沒有則right++,重復該過程,* 如果存在重復字符是,則left++,* 然后繼續走之前的循環,知道right==length時結束*/public static int lengthOfLongestSubstring(String s) {int maxRes = 0;int left = 0, right = 0;Set<Character> contains = new HashSet<>();
     //當left和right小于s.length是,繼續循環
while (left < s.length() && right < s.length()) {
       //獲取right索引出的字符
char c = s.charAt(right);
       //判斷right索引處的字符是否在left和right-1中出現過(這個借助的一個hashset結構來實現)
if (contains.contains(c)) {
          //出現過,則左索引自增,同事移除hashset中的cleft
++;contains.remove(c);} else {
          //沒有出現過,則將當前字符添加到hashset中,同事right向后移位,并更新maxRes的值contains.add(c);right
++;maxRes = Math.max(maxRes, right - left);}}return maxRes;}}

?

總結

以上是生活随笔為你收集整理的leetcode-3-无重复字符的最长子串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。