每日一题——分割两个字符串得到回文串

文章探讨了一种解决检查两个字符串是否能通过删除相同前后缀形成回文串的方法。初始实现导致超时,后经优化,通过去除相同前后缀并判断剩余部分是否为回文来提高效率。优化后的算法包括检查字符串的中心对称性,并使用substr函数减少不必要的遍历。
摘要由CSDN通过智能技术生成

一开始的超时解答:

class Solution { public: bool checkPalindrome(string a) { int len = a.length(); int j = len - 1; for (int i = 0; i < j; i++) { if (a[i] != a[j]) { return false; } j--; } return true; } bool checkPalindromeFormation(string a, string b) { int len = a.length(); if (checkPalindrome(a) || checkPalindrome(b)) { return true; } string temp1 = ""; string temp2 = b; string temp3 = ""; string temp4 = a; for (int i = 0; i < len; i++) { temp1 += a[i]; temp2 = b; temp2 = temp2.erase(0, i+1); temp3 += b[i]; temp4 = a; temp4 = temp4.erase(0, i+1); if (checkPalindrome(temp1 + temp2) || checkPalindrome(temp3 + temp4)) { return true; } } return false; } };

然后发现超时之后进行更正判断,发现只需刨去字符串a与字符串b相同前后缀之后,判断剩余的字符串a/b是不是回文串即可。

class Solution {
public:
    bool checkPalindrome(string a) {
        int j = a.length() - 1;
        for (int i = 0; i < j; i++) {
            if (a[i] != a[j]) {
                return false;
            }
            j--;
        }
        return true;
    }

    string substr(string a, int i) {
        int len = a.length();
        a = a.erase(len - i, len);
        a = a.erase(0, i);
        return a;
    }

    bool checkPalindromeFormation(string a, string b) {
        int len = a.length();
        bool index1 = true;
        bool index2 = true;
        for (int i = 0; i < len; i++) {
            if (index1) {
                if (a[i] == b[len - 1 - i]) {
                    if (i >= len / 2) {
                        return true;
                    }
                }
                else {
                    if (checkPalindrome(substr(a, i)) || checkPalindrome(substr(b, i))) {
                        return true;
                    }
                    index1 = false;
                }
            }
            if (index2) {
                if (b[i] == a[len - 1 - i]) {
                    if (i >= len / 2) {
                        return true;
                    }
                }
                else {
                    if (checkPalindrome(substr(a, i)) || checkPalindrome(substr(b, i))) {
                        return true;
                    }
                    index2 = false;
                }
            }
        }
        return false;
    }
};

示例代码:

class Solution { public: bool f(string a,string b) { int l = 0, r = b.size() - 1; while (l <= r && a[l] == b[r]) ++l,--r; return ff(a,l,r) || ff(b,l,r); } bool ff(string a,int l,int r) { while (l <= r) { if (a[l] != a[r]) return false; ++l,--r; } return true; } bool checkPalindromeFormation(string a, string b) { return f(a,b) || f(b,a); } };

在C语言中,判断一个字符串是否是回文串可以通过两种常见的方法实现: 1. **双指针法**:这是一种常用的迭代方法,创建两个指针,一个指向字符串的开始(i),另一个指向结束(j)。然后逐个比较对应的字符,如果它们相等则继续向中间移动,如果不相等则说明不是回文串。当两个指针相遇或者交叉时,都没有发现不相等的字符,则该字符串回文串。 ```c #include <stdio.h> #include <string.h> int isPalindrome(char str[]) { int i = 0, j = strlen(str) - 1; while (i < j) { if (str[i] != str[j]) return 0; // 回文串不成立 i++; j--; } return 1; // 字符串回文串 } int main() { char test[] = "madam"; if (isPalindrome(test)) printf("%s 是回文串\n", test); else printf("%s 不是回文串\n", test); return 0; } ``` 2. **递归法**:另一种方法是递归地比较字符串的第一个字符和最后一个字符,然后递归检查剩下的部分。如果所有对应位置的字符都相等,那么整个字符串就是回文串。 ```c #include <stdbool.h> #include <string.h> bool isPalindromeRec(char str[], int start, int end) { if (start >= end) return true; if (str[start] != str[end]) return false; return isPalindromeRec(str, start + 1, end - 1); } // 调用示例 bool isPalindromeCharByChar(const char* str) { return isPalindromeRec(str, 0, strlen(str) - 1); } int main() { if (isPalindromeCharByChar("madam")) printf("madam 是回文串\n"); else printf("madam 不是回文串\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值