1. 程式人生 > >LeetCode-Longest Substring Without Repeating Characters

LeetCode-Longest Substring Without Repeating Characters

JD integer wke bstr import urn i+1 mage note

Given a string, find the length of the longest substring without repeating characters.

Example:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

我自己寫的一個方法是爆搜,但是這個方法超時了。

代碼如下:

package com.leetcode.study;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        System.out.println(lengthOfLongestSubstring("wllxdiklosdrdxfohgwringzefwbytmwgxtjhdxwycpbawphcnbmajmeokhoftlmsexakuyixplxmagoojdospvjbcxh"));
        

    }
    
public static int lengthOfLongestSubstring(String s){ Map<String,Integer> map = new HashMap<String, Integer>(); for(int i = 0;i<s.length();i++){ if(map.containsKey(s.charAt(i)+"")){ continue; }else{ map.put(s.charAt(i)
+"", i); } } Set<String> set; int length = 0; boolean flag = false; for(int i = map.size();i>0;i--){ for (int j = 0; j < s.length()-i+1; j++) { String temp = s.substring(j, j+i); set = new HashSet<String>(); for(int k=0;k<temp.length();k++){ set.add(temp.charAt(k)+""); } if(set.size()==temp.length()){ length=set.size(); flag=true; break; } } if(flag){ break; } } return length; } }

代碼運行超時。

技術分享圖片

還是看看別人的代碼吧。

滑動窗口算法:

package com.leetcode.study;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        System.out.println(lengthOfLongestSubstring("abcabcbb"));
        

    }
    public static int lengthOfLongestSubstring(String s){
        int n = s.length();
        Set<Character> set = new HashSet<Character>();
        int ans=0,i=0,j=0;
        while(i<n&&j<n){
            if(!set.contains(s.charAt(j))){
                set.add(s.charAt(j));
                j++;
                ans=Math.max(ans, j-i);
            }else{
                set.remove(s.charAt(i));
                i++;
            }
        }
        return ans;
        
    }
    
    

}

這個方法沒太弄明白。

LeetCode-Longest Substring Without Repeating Characters