最长对称子串

//求一个字符串中最长对称字串,好像有点如google,那么输出goog

/*
O(n2)的算法
如果我们换一种思路,我们从里向外来判断。也就是我们先判断子字符串A是不是对称的。
如果A不是对称的,那么向该子字符串两端各延长一个字符得到的字符串肯定不是对称的。
如果A对称,那么我们只需要判断A两端延长的一个字符是不是相等的,如果相等,则延长后的字符串是对称的。
因此在知道A是否对称之后,只需要O(1)的时间就能知道aAa是不是对称的。
*/

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
using namespace std;

bool IsSymmetrical(char* pBegin, char* pEnd);
void GetLongestSymmetricalLength_2(char* pString);

void GetLongestSymmetricalLength(char* pString);

void main()
{
    char c[30];
    gets_s(c);

    //string s;
    //while(cin>>s){
    //const char* c = s.c_str();

    //GetLongestSymmetricalLength(c);
    //}

    GetLongestSymmetricalLength_2(c);
    system("pause");
}

void GetLongestSymmetricalLength(char* pString)
{
       if(pString == NULL)
              return;

       int symmeticalLength = 1;

       char* pChar = pString;
       while(*pChar != ‘\0‘)
       {
              // Substrings with odd length
              char* pFirst = pChar - 1;
              char* pLast = pChar + 1;
              while(pFirst >= pString && *pLast != ‘\0‘ && *pFirst == *pLast)
              {
                     pFirst--;
                     pLast++;
              }

              int newLength = pLast - pFirst - 1;
              if(newLength > symmeticalLength)
                     symmeticalLength = newLength;

              // Substrings with even length
              pFirst = pChar;
              pLast = pChar + 1;
              while(pFirst >= pString && *pLast != ‘\0‘ && *pFirst == *pLast)
              {
                     pFirst--;
                     pLast++;
              }

              newLength = pLast - pFirst - 1;
              if(newLength > symmeticalLength)
                     symmeticalLength = newLength;

              pChar++;
       }

        cout<<symmeticalLength<<endl;
}

//方法2
//先判断字符串是否对称
//现在我们试着来得到对称子字符串的最大长度。最直观的做法就是得到输入字符串的所有子字符串,并逐个判断是不是对称的。
//如果一个子字符串是对称的,我们就得到它的长度。这样经过比较,就能得到最长的对称子字符串的长度了。

//先判断字符串是否对称
bool IsSymmetrical(char* pBegin, char* pEnd)
{
       if(pBegin == NULL || pEnd == NULL || pBegin > pEnd)
              return false;

       while(pBegin < pEnd)
       {
              if(*pBegin != *pEnd)
                     return false;

              pBegin++;
              pEnd --;
       }

       return true;
}

void GetLongestSymmetricalLength_2(char* pString)
{
       if(pString == NULL)
              return;

       int symmeticalLength = 1;

       char* pFirst = pString;
       int length = strlen(pString);
       while(pFirst < &pString[length - 1])
       {
              char* pLast = pFirst + 1;
              while(pLast <= &pString[length - 1])
              {
                     if(IsSymmetrical(pFirst, pLast))
                     {
                           int newLength = pLast - pFirst + 1;
                           if(newLength > symmeticalLength)
                                  symmeticalLength = newLength;
                     }

                     pLast++;
              }

              pFirst++;
       }

       cout<<symmeticalLength<<endl;
}
时间: 2024-10-12 07:18:06

最长对称子串的相关文章

L2-008. 最长对称子串

L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11. 输入格式: 输入在一行中给出长度不超过1000的非空字符串. 输出格式: 在一行中输出最长对称子串的长度. 输入样例: Is PAT

PAT L2-008. 最长对称子串

题目链接:PAT L2-008. 最长对称子串 题意: 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11. 题解: 直接枚举中点,暴力一下 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std

天梯杯 L2-008. 最长对称子串(马拉车算法应用)

最长对称子串 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一行中给出长度不超过1000的非空字符串. 输出格式: 在一行中输出最长对称子串的长度. 马拉车算法: 一)第一步是改造字符串S,变为T,其改造的方法如下: 在字符串S的字符之间和S的首尾都插入一个"#",如:S="abba"变为T="#a#b#b

L2-008 最长对称子串 (25 分) (模拟)

链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376 题目: 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一行中给出长度不超过1000的非空字符串. 输出格式: 在一行中输出最长对称子串的长度. 输入样例: Is PAT&TAP symme

PTA——最长对称子串

PTA 7-64 最长对称子串 1 //流程: 2 //数组存储字符串,指针i从头遍历 3 //str[i-2]==str[i],若相等则记录对称串的长度,同时指针j从i-2开始向后遍历 4 //两个指针所指内容不相等时停止遍历,更新对称串的长度 5 //奇数情况// 6 //变量: 7 //字符数组str 8 //指针i.j 9 //状态变量sys——当前对称串是否在增长 10 //temp——当前对称串长度 11 // lng——当前最长对称串长度 12 //细节: 13 //i从2开始遍历

L2-008 最长对称子串 (25分)

对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一行中给出长度不超过1000的非空字符串. 输出格式: 在一行中输出最长对称子串的长度. 输入样例: Is PAT&TAP symmetric? 输出样例: 11 思路:本题可以有多种方法来解决,动态规划,马拉车等等,但是我更擅长动态规划来解决此题,本题定义一个动态规划数组dp[i][j],表示的意义为

(算法-字符串)最长对称子串

题目: 输入字符串中对称的子字符串的最大长度.比如输入字符串“roorle”,由于该字符串里最长的对称子字符串是“roor”,因此输出4. 思路: 1.求字符串”roorle“和反序”elroor“的最长公共子串 2.最长回文子串 代码: 1.最长公共子串 #include<iostream> using namespace std; // naive method // O(n^3) int comlen(const string &str1,int i,int m,const st

L2-008. 最长对称子串 (有个知识点没看)

题目: 思路 方法一:判断字符串的每一个子串,若是对称的,则求出它的长度即可.这种办法对每一个子串,从两头向中间判断是不是子串.总的时间复杂度为O(n^3), 下面给出时间复杂度是O(n^2)的思路. 方法二:与方法一正好相反,字符串中的每一个开始,向两边扩展,此时可分为两种情况: (1)对称子串长度是奇数时, 以当前字符为对称轴向两边扩展比较 (2)对称子串长度是偶数时,以当前字符和它右边的字符为对称轴向两边扩展 1 #include <cstdio> 2 #include <cstr

最长对称子串 (最长回文字串) pta 7-12

题目链接https://pintia.cn/problem-sets/1218774283169423360/problems/1218774532776648715 方法一, 见代码 #include <cstdio> #include <iostream> #include <algorithm> #include <string> #include <cstring> #include<cmath> #include<ve