求最长递增子串

本文介绍了一道Java笔试题的解决方案,该题要求从给定的小写字母字符串中找出最长递增子串。文章提供了完整的代码示例,通过递归方法检查字符串中的每个字符以确定是否构成递增子串。

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

最近看到一个Java笔试题:求最长递增子串
    题目:给定一个只包含小写字母(a-z)的字符串。找出其中最长递增子串(子串是指连续的子串)。
    例如:给定ababc输出abc
 public static void main(String [] args){
        String str="abcefghjklmn";
        System.out.println("str:"+getMaxSubStr(str));
    }

    static String s="";    //标记最长子串
    public static String getMaxSubStr(String str){
        String s="";    //标记最长子串
        return getStr(str,0,0,1);
    }

    /**
     *
     * @param str       待查找字符串
     * @param start     标记子串初始位置
     * @param sf        标记两字符比较的第一个字符
     * @param end       标记两字符比较的第二个字符
     * @return          返回最长字符串
     */
    public static String getStr(String str,int start,int sf,int end){
        if (str.length()<2){
            return str;
        }
        String s1="";   //标记当前子串
        if (str.charAt(end)-str.charAt(sf)==1){//当前子串递增
            sf++;
            end++;
            if (end<=str.length()-1){
                return getStr(str,start,sf,end);
            }else {
                s1=str.substring(start,end);
                System.out.print("s1:"+s1);
                System.out.println("  s:"+s);
                if (s1.length()>s.length()){//当前子串长度大于最大子串长度
                    s=s1;
                }
                return s;
            }
        }else {
            s1=str.substring(start,end);
            System.out.print("s1:"+s1);
            System.out.println("   s:"+s);
            if (s1.length()>s.length()){//当前子串长度大于最大子串长度
                s=s1;
            }
            if (end==str.length()-1){
                return s;
            }else {
                return getStr(str,end,end,end+1);
            }
        }
    }
为了满足你的需,你需要在`printResults`函数内部添加一个循环,遍历所有的最长递增子串及其对应的颜色,并在输出时显式地展示子串的头和尾。以下是修改后的代码片段: ```cpp void printResults(const vector<int>& a, const map<int, int>& memo, const vector<int>& color) { int maxLen = 0; for (const auto& p : memo) { maxLen = max(maxLen, p.second); } cout << "\n存在" << maxLen << "个长度为" << maxLen << "的最长递增子串:" << endl; for (auto it = memo.begin(); it != memo.end(); ++it) { if (it- maxLen + 1; int end = it->first; cout << " 子串 " << start << " ~ " << end << ": "; // 输出子串的数字,并根据颜色设置格式 for (int i = start; i <= end; ++i) { if (color[i] == 1) { cout << "\033[33m"; // 设置为黄色 } cout << a[i] << " "; if (color[i] == 1) { cout << "\033[0m"; // 恢复默认颜色 } } cout << endl; } } // 删除下面的这一行,因为我们已经输出了完整的子串信息 // for (int i = 0; i < a.size(); ++i) { // cout << a[i]; // if (i < a.size() - 1) { // cout << " "; // } // } // cout << endl; // ... 其他代码保持不变 } ``` 在这个版本的`printResults`函数里,我们添加了一个内层循环,用于逐个输出每个长度为`maxLen`的子串及其对应的颜色。注意,我已经移除了不需要的原始数字列表输出行。现在,当你运行此代码,它将完整地输出最长递增子串的数量、长度,以及每个子串的头部和尾部,同时高亮显示指定的颜色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值