当前位置 : 主页 > 编程语言 > c语言 >

尺取法例题C++

来源:互联网 收集:自由互联 发布时间:2023-08-25
一、反向扫描 (1)、判断回文串 bool check(string s, int left, int right) { int i=left,j=right; while(ij) { if(s[i]!=s[j]) { return false; } i++; j--; } return true; } 1、有效回文串 描述给定一个字符串,判断其是

一、反向扫描

(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;
    }
};

二、同向扫描

上一篇:《图》算法专题C++
下一篇:没有了
网友评论