题解 CF981A 【Antipalindrome】

题目

The first line contains a non-empty string \(s\) with length at most \(50\) characters, containing lowercase English letters only.

数据范围比较小,这里就直接上 \(\operatorname{O}(n^2)\) 的做法。
其实是我懒得想优化的方法。

思路

  • 双重循环枚举子串的端点
  • 判断是否为非回文串,并更新数据

重点讲一下几个 string 类型的操作。

substr函数


例如:

string str = "string";
cout<<str.substr(1,5); 

输出结果为 \(\mathtt{trin}\)。
其中 \(substr(i,j)\) 表示 截取 \(i\) ~ \(j-1\) 的子串

reverse函数


快速翻转一个字符串:

string str;
reverse(str.begin(),str.end());

接着就可以比较并判断了。

Code:

#include<bits/stdc++.h>
using namespace std;
string str;
int ans;
int main()
{
	cin>>str;
	for(int i=0;i<str.length();i++)  //双层循环枚举子串左右端点
    {
        for(int j=i+1;j<str.length();j++)
        {
            string a = str.substr(i,j-i+1);  //根据循环截取子串
            if(a.length()<=ans) continue;    //如果子串的长度不比当前答案长,那么就没有判断的必要了
            string b = a;
            reverse(b.begin(),b.end());
            if(a!=b) ans = a.length();     //能运行到这里,就可以直接赋值了
        }
    }
    cout<<ans;
	return 0;
}

string 类型真好用

上一篇:php反转字符串的三种方法


下一篇:R语言中substr函数,字符串截取函数