Leetcode 第三题 Longest Substring Without Repeating Characters JAVA解法

来源:互联网 发布:哈布斯堡家族现状知乎 编辑:程序博客网 时间:2024/05/21 13:22
class Solution {


        
 // 思路:
    把String转化成一个character的数组
    然后把这个数组的元素一一放到hashmap里面去
    从第一个字母开始 一直放 直到遇到第一次重复(用 hashmap.containsKey 方法来判断这个字母有没有重复过)
    放进去的时候有讲究 就是把放进去的value设为数组的下  比如把stringArr[i] → i  之后可以用来判断index
    首先来判断此时的hashmap的大小(hashmap里的元素都是非重复的) 跟max进行比较
    然后 找到重复的元素的index 
    比如 vsdsaf 我们放进了v s d到hashmap 当我们放入第二个s的时候 就回得到第一个s的index
    然后我们的目标是把从第一个字母到第一个重复的字母这些全部删掉
    因为vsd是vs开头的最长的非重复的substring了 之后就会碰到vsds 删掉vs 我们就可以从ds开始 然后dsaf这么往下找下去
    最后返回max的时候注意 有可能全部都是非重复元素 这时我们应该比较一下max和hashmap.size()的大小关系
    
    
public static int lengthOfLongestSubstring(String s) {
         char[] stringArr = s.toCharArray();
       
        Map<Character,Integer> hashmap = new HashMap<Character,Integer>();
        int max = 0;
        int flag = 0;
        
        for(int i = 0 ; i < stringArr.length ; i++)
        {
        
        if(!hashmap.containsKey(stringArr[i])) {
        hashmap.put(stringArr[i], i);
                
        continue;
        }
        if(hashmap.containsKey(stringArr[i])) {
       
        max = Math.max(hashmap.size(),max);
        int repeatedIndex = hashmap.get(stringArr[i]);
       
                for(int j = flag; j<= repeatedIndex ; j++)
                {
               
                hashmap.remove(stringArr[j]);
                }
                flag =  repeatedIndex + 1;
                hashmap.put(stringArr[i], i);
                
                
        }
       
        }
      return max>=hashmap.size() ? max : hashmap.size();
    }
}
        
阅读全文
0 0
原创粉丝点击