双指针法--牛牛的独特子序列

本文介绍了一个算法问题,目标是从给定字符串中找出最长的独特子序列,该子序列由三部分组成:前n个字符为'a',接下来n个字符为'b',最后n个字符为'c'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
牛牛现在有一个长度为len只包含小写字母‘a’-'z’的字符串x,他现在想要一个特殊的子序列,这个子序列的长度为3n(n为非负整数),子序列的第[1,n]个字母全部为‘a’,子序列的[n+1,2n]个字母全部为‘b’,子序列的[2n+1,3n]个字母全部为‘c’,牛牛想知道最长的符合条件的独特子序列的长度是多少。

在这里插入图片描述
在这里插入图片描述

public class maxnumlength {
    public int solve (String x) {
        // write code here
        int result=0;
        char[] charx=x.toCharArray();
        StringBuilder s=new StringBuilder();
        int nb=0;
        for (int i = 0; i < charx.length; i++) {
            char c=charx[i];
            if (c=='a'||c=='b'||c=='c') {
                s.append(c);
                if(c=='b') nb++;
            }
        }
        //双指针法,筛选b,一组一组的找
        int l=0,r=s.length()-1,na=0,nc=0;
        while (l<r) {
            //找a
            while (s.charAt(l)!='a') {
                //筛选b
                if (s.charAt(l)=='b') {
                    nb--;
                }
                l++;
            }
            if (s.charAt(l)=='a') {
                na++;
            }

            //找c
            while (s.charAt(r)!='c') {
                //筛选b
                if (s.charAt(r)=='b') {
                    nb--;
                }
                r--;
            }
            if (s.charAt(r)=='c') {
                nc++;
            }

            //判断是否存在nb,使得na==nb==nc
            if (l<r&&na==nc) {
                if (nb>=na) {
                    result=na;
                }
                l++;
                r--;
            }
            else {
                break;
            }
        }
        
        return result*3;
    }
    public static void main(String[] args) {
      maxnumlength ma=new maxnumlength();
      String x="abaabbcccc";
      int result=ma.solve(x);
      System.out.println(result);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值