头条2018替换'a'或'b'

https://www.nowcoder.com/practice/dcc301bc11a7420b88afdbd272299809?tpId=90&tqId=30813&tPage=2&rp=2&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking

首先用区间动态规划的思想

dp[i][j] 第i位开始的长度为j的串修改所需要的次数

        for(char c='a';c<'c';c++) {
            int temp=1;
            int[][] dp=new int[n+1][n+1];//表示全部修改成一种字母所需要的次数
            for(int i=0;i<n;i++)
                dp[i][1] = str.charAt(i)==c?0:1;
            for(int len=2;len<=n;len++) {
                for(int i=0;i+len-1<n;i++) {    
                    int r=str.charAt(i+len-1)==c?0:1;
                    int l=str.charAt(i)==c?0:1;
                    dp[i][len]=Math.min(dp[i][len-1]+r, dp[i+1][len-1]+l);//这个地方有点不好理解
                    if(dp[i][len]<=k)
                        temp=len;
                }
            }
            res=Math.max(res, temp);
        }
        System.out.println(res);

采用前缀数组的思想,前缀数组间的差就是修改以后的最大长度

        Scanner in = new Scanner(System.in);
        int n=in.nextInt(),k=in.nextInt();
        String str=in.next();
        int res=0;
        for (char c = 'a'; c < 'c'; ++c) {
            int temp=1;
            ArrayList<Integer> sums = new ArrayList<>();//记录前缀数组下标
            for (int i = 0; i <n ; ++i) {
                if(str.charAt(i)==c)
                    sums.add(i);
            }
            if(sums.size()<=k) temp=n;
            sums.add(n);
            for (int i = k+1; i < sums.size(); i++) {
                temp = Integer.max(temp, sums.get(i) - sums.get(i - k - 1) - 1);//关键代码
            }
            res=Math.max(res,temp);
        }
        System.out.println(res);

 

posted @ 2019-05-19 15:17  LeeJuly  阅读(216)  评论(0)    收藏  举报