LintCode386. 最多有k个不同字符的最长子字符串 渣渣学算法系列

菜是原罪,这道题困住我一天

本来03/01晚上看了别人对这道题的分析,然后因为之前已经自己码了两道双指针的题目,觉得自己可以改一改顺着思想就应付过去,没成想,总是卡在某些case上,真心难受…脑壳疼啊啊啊,迟迟无法ac实在是难受,然后各种看别人的代码,心里想着怎么能把自己的改对,然而一直徒劳,但我还是不肯放弃,洗澡的时候也在想,但是毕竟有些分心,但是想不出,终于在03/02 21:38 通过了,但是脑瓜子嗡嗡的,可能是刚刚喝了两瓶科罗娜的关系吧,嘎嘎.一想着一会儿又要去赶4:16的火车又很无奈,毕竟又要开学了…

双指针,就是一个是主指针,一个是辅指针,一个for loop,一个 while,当然 for loop 中的变量可能是一步一步走的,而while中的变量具体要走多少步(不是步进值的意思)就不一定了.

本来想对照一下leetcode的题目,但是发现题目不是一样的,所以就还是放弃了.用hashmap也行,用辅助数组也可以,只要能记录值就行,关键点就是临界值的变化要记录,别的也没啥,但是有的解法是不断让左指针向右移动以去除多出来的新字母其实是很棒的优化.

其实主体框架昨天晚上就形成了,但是就是if(count > k){}这里没有处理好,这里一定要向dfs一行把状态还原好才行啊!!!右指针j因为总是指向结果范围 的下一个位置,所以才要恢复arr[ch[j]]的状态和break不让j再向后走.就这一段坑了一天…果然还是那句话 菜是原罪.

最终ac代码:Java实现
public class Solution {
    /**
     * @param s: A string
     * @param k: An integer
     * @return: An integer
     */
    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        //记录每个字符ch在两个指针中间出现的次数freq[ch]
        //当freq[ch]增加或减少到临界值,修改满足条件的字符数
        
        //本题解法
        //同向双指针,记录每个字符ch在两个指针中间出现的次数freq[ch]
        //一旦freq[ch] 增加到1 ,记录这个字符出现了,一旦freq[ch]减少到0,记录这个结果不再出现
        //出现的字符数<=k  ->  用当前区间程度更新最优解
        char [] ch = s.toCharArray();
        int [] arr = new int[256];
        Arrays.fill(arr,0);
        int maxLen = 0;
        int count = 0;
        int i , j = 0 ;
        for( i = 0 ; i < s.length() ; i ++){
           
            
            while( j < s.length() && count <= k){
                arr[ch[j]]++;
                if(arr[ch[j]]==1){
                    count++;
                }
                if(count > k){
                    // maxLen = (j-i)>maxLen?(j-i):maxLen;
                    arr[ch[j]]--;
                    count--;
                    break;
                }
                    
                j++;
            }
            
            maxLen = (j-i)>maxLen?(j-i):maxLen;
            
            arr[ch[i]]--;
            if(arr[ch[i]]==0){
                count--;
            }    
        }
        return maxLen;
    }
}

截止到2019/03/02 21:46

LintCode386. 最多有k个不同字符的最长子字符串 渣渣学算法系列_第1张图片

你可能感兴趣的:(算法代码demo,双指针,LintCode)