C++每日一练:小艺照镜子(详解分治法)

这篇具有很好参考价值的文章主要介绍了C++每日一练:小艺照镜子(详解分治法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

大过节的,不想去看人后脑勺,就做点题来玩。挑了小艺照镜子,百分通过~
C++每日一练:小艺照镜子(详解分治法)


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目

题目名称:
小艺照镜子

题目描述:
已知字符串str。 输出字符串str中最长回文串的长度。

输入描述:
输入字符串s.(1<=len(str)<=10000)

示例:
输入
abab

输出
3

二、解题

1.分析

这题 初一看挺简单的,先取最大值 0 到 字符长度,然后不停的减小长度比较就行了,结果行不通。纠结好半天,改变思路,先假设最小的情况2或3个,再不停增大,一直到前后不相同。

分三个函数来解释:

函数一:用来测试aba的情况下的回文串

int test_odd(string &s, int m){
    int l = m-1, r = m+1, len = 1;
    while(l >=0  && r < (int)s.length()){
        if(s[l] == s[r]) l--, r++, len += 2;
        else break;
    }
    return len;
}

很简单的代码,m为中间的b,则l就是a,r也是a。初始就是1个回文,找到l和r相同,就加2个。如此从m为1到结束。就找出了所有奇数情况的回文串,并取得最大的一个。

函数二:用来测试baab的情况下的回文串

int test_even(string &s, int m){
    int l = m, r = m+1, len = 0;
    while(l>=0 && r<(int)s.length()){
        if(s[l] == s[r]) l--, r++, len += 2;
        else break;
    }
    return len;
}

这和上在的逻辑差不多,不过就是从s[0] 与s[1] 比较开始罢了,不用解释了吧~

函数三:综合循环一下就好了,就是solution部分。

完整代码:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

int test_odd(string &s, int m){
    int l = m-1, r = m+1, len = 1;
    while(l >=0  && r < (int)s.length()){
        if(s[l] == s[r]) l--, r++, len += 2;
        else break;
    }
    return len;
}

int test_even(string &s, int m){
    int l = m, r = m+1, len = 0;
    while(l>=0 && r<(int)s.length()){
        if(s[l] == s[r]) l--, r++, len += 2;
        else break;
    }
    return len;
}

int solution(std::string s){
    int result = 1;
    // TODO:
    int L = s.length(), res_odd = 0, res_even = 0;
    if (L>=2){
        for (int i=1; i<L; ++i){
            if(s[i-1] == s[i+1]){
                res_odd = max(res_odd, test_odd(s, i));
            };
        }

        for(int i=0; i<L; ++i){
            if (s[i] == s[i+1]){
                res_even = max(res_even, test_even(s, i));
            }
        }
    }
    result = max(result, max(res_odd, res_even));
    return result;
}


int main() {

    std::string s="abc";

    //getline(std::cin, s);;

    int result = solution(s);

    std::cout<<result<<std::endl;

    return 0;
}

看solution部分:因为至少一个字母的情况也能算是回文,所以就默认值为1。
先找出奇数情况下最长的回文,再找出偶数情况下的。
为了尽量减少循环,笔者在调用奇、偶查找之前,先设了一个条件:
奇数情况要求:if(s[i-1] == s[i+1])
偶数情况要求:if (s[i] == s[i+1])
也就是最少要存在回文大于1的情况才去查找是不是有更多的回文。
这样能极大的减少两个查找函数的调用,要不然怕是可能会超时。
最后result = max(result, max(res_odd, res_even));
找出最大值就完事!


总结

把一个较复杂的问题,分解成若干个较简单的问题,这应该也算是分治法了吧~ 分而治之嘛!文章来源地址https://www.toymoban.com/news/detail-430873.html

到了这里,关于C++每日一练:小艺照镜子(详解分治法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 每日一练

    突然想起了C++,很久没用过了,python真香,为了做个正经程序人,捡起来练练。就用csdn的每日一练试试。 要代码效率就用C++,要码代效率就用python。 `提示:2023年4月5号清明节的每日一练。 描述:小Q的柠檬汁做完了。 掏出了自己的数字卡牌。 想要和别人做数字游戏。 可是

    2023年04月09日
    浏览(32)
  • C++每日一练(7):爬山

    题目描述 LeiQ最近参加了一个登山俱乐部,部长给他了一个n*m地图,地图上的每一个格子的值表示一个山的海拔高度,LeiQ现在在(x,y)表示在地图上的位置,他想要登上地图上最高的山,所以他想知道他爬上最高的山的山顶还需向上爬多少米。 例如:  xy 1 2 3 1 100  130  150 2 200  

    2024年02月03日
    浏览(21)
  • C++每日一练(8):图像相似度

    题目描述 给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。 说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。 输入 第一行包含两个整数m和n,表示图像

    2024年02月03日
    浏览(28)
  • C++每日一练(15):简单幂计算

    题目描述 输入两个数a和b,求a的b次方。 输入 输入两个整数a,b(1=a=10,1=b=15)。 输出 输出一个正整数,该值=1000000000000。 输入样例 3 3 输出样例 27 参考答案 这段是用了pow函数,当然也可以用for循环实现(这里就不展示了哈)。 

    2024年01月17日
    浏览(29)
  • C++每日一练:最长递增区间 && 阿波罗的魔力宝石 && 投篮

    今天的题太简单,甚至 “最长递增区间” 和 “投篮” 就是一个问题。实在没事干,也给做了!直接上代码算了… 提示:以下是本篇文章正文内容 代码如下: 注意点就是默认值为1。 代码如下: 很简单的冒泡排序,没加flag。 代码如下: 这简直和第一题一模一样!我估计条

    2023年04月26日
    浏览(30)
  • 百题千解计划【CSDN每日一练】“小明投篮,罚球线投球可得一分”(附解析+多种实现方法:Python、Java、C、C++、C#、Go、JavaScript)

      这个心上人,还不知道在哪里,感觉明天就会出现。     🎯作者主页: 追光者♂🔥          🌸个人简介:   💖[1] 计算机专业硕士研究生💖   🌟[2] 2022年度博客之星人工智能领域TOP4🌟   🏅[3] 阿里云社区特邀专家博主🏅   🏆[4] CSDN-人工智能领域优质创作者🏆

    2024年02月15日
    浏览(45)
  • python每日一练(9)

       🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:Aileen_0v0🧸—CSDN博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:Ailee

    2024年02月07日
    浏览(27)
  • Python每日一练(20230420)

    目录 1. 数组逐位判断  🌟 2. 交错字符串  🌟🌟 3. 二进制求和  🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 比如有以下数组: a1: 1,0,0,1,0,0,0,1 a2: 0,0,0,0,1,1,1,1 a3: 0,1,0,1,0,1,0,0 a4: 1,0,1,1,1,1,0,0 a5: ....... 抓取三个数

    2023年04月20日
    浏览(27)
  • Python每日一练(20230408)

    目录 1. 两数相除  🌟🌟 2. 分割回文串  🌟🌟 3. x 的平方根  🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给定两个整数,被除数  dividend  和除数  divisor 。将两数相除,要求不使用乘法、除法和 mod 运算符。

    2024年02月02日
    浏览(33)
  • Python每日一练(20230502)

    目录 1. 被围绕的区域  🌟🌟 2. 两数之和 II  🌟 3. 二叉树展开为链表  🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给你一个  m x n  的矩阵  board  ,由若干字符  \\\'X\\\'  和  \\\'O\\\'  ,找到所有被  \\\'X\\\'  围绕的

    2024年02月02日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包