描述试写一个算法识别字符序列是否为形如‘子序列1&子序列2’模式的字符序列其中子序列2是子序列1的逆序列0<子序列字符串长度<1000且都为小写字母。输出YES或者NO。输入描述一行字符序列输出描述YES或NO希望能用c++编写代码输入:hello&ollhe输出:NO
思路:
- 首先判断输入的字符序列的长度是否合法,即长度大于0且小于1000。
- 然后判断字符序列中是否包含字符'&',如果不包含则输出NO。
- 将字符序列分成子序列1和子序列2,即将'&'之前的部分作为子序列1,'&'之后的部分作为子序列2。
- 判断子序列2是否为子序列1的逆序列,即判断子序列1和子序列2是否相等。
- 如果相等,则输出YES;否则输出NO。
代码如下:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string isReverse(string s1, string s2) {
reverse(s1.begin(), s1.end()); // 将s1逆序
if (s1 == s2) {
return "YES";
} else {
return "NO";
}
}
int main() {
string s;
cin >> s;
int len = s.length();
if (len == 0 || len >= 1000) { // 判断长度是否合法
cout << "NO" << endl;
return 0;
}
if (s.find('&') == string::npos) { // 判断是否包含'&'
cout << "NO" << endl;
return 0;
}
string s1 = s.substr(0, s.find('&')); // 子序列1
string s2 = s.substr(s.find('&') + 1); // 子序列2
cout << isReverse(s1, s2) << endl; // 判断是否为逆序列
return 0;
}
时间复杂度分析:
- 判断长度是否合法的时间复杂度为O(1)。
- 判断是否包含'&'的时间复杂度为O(n),其中n为字符序列的长度。
- 分割字符序列的时间复杂度为O(n),其中n为字符序列的长度。
- 判断子序列2是否为子序列1的逆序列的时间复杂度为O(n),其中n为子序列的长度。 综上,算法的时间复杂度为O(n)。
原文地址: http://www.cveoy.top/t/topic/jau6 著作权归作者所有。请勿转载和采集!