首页 > 编程语言 >尺取法例题C++

尺取法例题C++

时间:2023-08-13 16:33:52浏览次数:32  
标签:right string int C++ bool 取法 left 例题 回文

一、反向扫描

(1)、判断回文串

bool check(string &s, int left, int right)
    {
        int i=left,j=right;
        while(i<j)
        {
            if(s[i]!=s[j])
            {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }
1、有效回文串

描述 给定一个字符串,判断其是否为一个回文串。只考虑字母和数字,并忽略大小写。 输入: "A man, a plan, a canal: Panama" 输出: true

isalnum(int c):判断c是否为字母或数字 tolower(int c):将字母转成小写,如果c就是数字则不改变

class Solution {
public:
    bool isPalindrome(string &s) {
        // write your code here
        int i=0,j=s.length()-1;
        bool flag=true;
        while(i<j)
        {
            while(i<j && !isalnum(s[i]))
            {
                i++;// 忽略前面的非数字
            }
            while(i<j && !isalnum(s[j]))
            {
                j--;
            }
            if(i<j)
            {
                if(tolower(s[i])!=tolower(s[j]))
                {
                    flag=false;
                    break;
                }
            }
            i++;// 移动指针
            j--;
        }
        return flag;
    }
};
2、至多删除一个字符,使其为回文串

描述 给一个非空字符串 s,你最多可以删除一个字符。判断是否可以把它变成回文串。 给定的字符串只包含小写字母 字符串的长度最大为 50000

不需要实际地将字符删除,只需要检查s是否为回文串时,将其“过滤”掉

s="abbcba"
首先 ab 和 ba 能够组成回文串
此时 left=2,指向第2个b,right=3,指向c
再看s(2+1,3),即b ,s(2,3-1)即c是否为回文串,即过滤掉了c或者b
因为内部的子串是回文串,外部的也是回文串,所以整个s也是回文串(删除了中间的b或c)
class Solution {
public:
// 检查 s 的子串(left,right)是否为回文串
    bool check(string &s, int left, int right)
    {
        int i=left,j=right;
        while(i<j)
        {
            if(s[i]!=s[j])
            {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }
    bool validPalindrome(string &s) {
        // Write your code here
        int i=0,j=s.length()-1;
        while(i<j)
        {
            if(s[i]==s[j])
            {
                i++;
                j--;
            }else
            {
                return check(s,i+1,j) || check(s,i,j-1);
            }

        }
        return true;
    }
};

二、同向扫描

标签:right,string,int,C++,bool,取法,left,例题,回文
From: https://blog.51cto.com/u_16131726/7067865

相关文章

  • 《图》算法专题C++
    1、Floyd算法【题目描述】平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。【输入】共n+m+3行,其中:第一行为......
  • 树的简单应用C++算法学习
    1、找树根和孩子【题目描述】给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子。【输入】第一行:n(结点个数≤100),m(边数≤200)。以下m行:每行两个结点x和y,表示y是x的孩子(x,y≤1000)。【输出】第一行:树根:root;第二行:孩子最多的结点max;第三行:max的孩子(按编号由小到输出)。【输入......
  • C++STL库 二分查找,以及对set集合进行二分查找,来源于”leetcode7022. 限制条件下元素之
    C++的头文件<algorithm>中有用于二分查找的函数,lower_bound()、upper_bound()以及binary_search():lower_bound():返回大于等于目标值的第一个位置upper_bound():返回大于目标值的第一个位置,binary_search():若目标值存在则返回true,否则返回false参数列表:(起始位置,结束位置,目标值) ......
  • C++中的类1
    一、初始化列表初始化列表是在C++类的构造函数中使用的一种特殊语法。它允许在对象创建时对成员变量进行初始化。通常,在构造函数的函数体中,我们会使用赋值操作符(=)来对成员变量进行初始化。然而,初始化列表提供了一种在构造函数签名之后的初始化成员变量的方式。初始化列表使用......
  • 【逗号你真的懂吗?】C++与JAVA中逗号的区别
    参考文章:这里一、先上结论C++中的逗号几乎可以说是随便使用,但是JAVA中的逗号就要注意了:JAVA中使用逗号(,)来分隔多条赋值语句时,只能在分隔方法的参数、定义变量时或用于for循环的表达式时使用,别的地方一律不能,只能将每条语句用分号(;)隔开。二、C++中的逗号逗号运算符和逗号表达式......
  • C++ 与 QML交互
    前言在QT中既然qml处理前端,C++处理后端,那么C++和QML是如何进行交互?将对象暴露给qmlvoidQQmlContext::setContextProperty(constQString&name,QObject*value)Setthevalueofthenamepropertyonthiscontext.QQmlContextdoesnottakeownershipofvalue.......
  • C++互斥锁
    C++11提供了4种锁机制mutex:互斥锁timed_mutex:带超时机制的互斥锁recursive_mutex:递归互斥锁recursive_imed_mutex:带超时机制的递归互斥锁!使用前需添加头文件#include<mutex>metex:使用伪代码方式mutexmtx;mtx.lock();//申请加锁。(需要加锁的资源)mtx.unlo......
  • C++通用学习速成判定
    C++的继承【C++】继承_c++继承_风继续吹TT的博客-CSDN博客#include<iostream>#include<string>usingnamespacestd;classPerson{public: voidPrint() { cout<<"_name_age_sex"<<endl; }protected: string_name; int_age; char......
  • C C++ Java python HTML/CSS/JavaScript
    C/C++是一种底层的语言,它可以直接操作内存和硬件,运行速度很快,但是也很难学习和调试,容易出错。Java是一种面向对象的语言,它可以跨平台运行,有很多成熟的框架和库,适合做大型的企业级应用,但是也很繁琐和冗长,需要写很多代码。Python是一种高级的语言,它可以用简洁的语法来实现复杂的功能......
  • C++系列三:QT初识
    目录前言QT介绍前言开发环境,挺折腾人,一波三折。参考链接:C语言中文网、QT快速入门官方文档QT介绍跨平台的GUI。主要用于桌面程序开发和嵌入式开发。目前Qt的开源授权有两种,一种是GPL授权,另一种是LGPL授权QML主要用于手机移动应用程序Windows下的GUI解决方案......