问题描述:
给定一个长度为 𝑁N 的字符串 𝑆,字符串仅由小写英文字母组成。我们需要找出通过排列 𝑆 的字符(包括 𝑆 本身)后得到的字符串中,不包含长度为 𝐾 的回文子串的字符串的个数。
我们可以将其拆分成3块区域,判断回文,判断是否存在回文子串,全排列所有组合
判断回文:
bool solve1(const string& str, int k) {//判断回文
for (int i = 0; i < k / 2; ++i) {
if (str[i] != str[k - 1 - i]) {
return false;
}
}
return true;
}
判断是否存在回文子串:
bool solve2(const string& str, int k) {// 判断字符串中是否包含长度为k的回文子串
for (int i = 0; i <= str.size() - k; ++i) {
if (solve1(str.substr(i, k), k)) {
return true;
}
}
return false;
}
全排列:
next_permutation(s.begin(), s.end())
这里我们采用会去重的next_permutation(),以防重复计算;
以下附上完整代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using vi=vector<int>;
using pii=pair<int,int>;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const double eps=1e-6;
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rrep(i,a,b) for(int i=a;i>=b;--i)
#define mst(x,i) memset(x,i,sizeof(x))
#define gkd ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define lb(x) (x&-x)
const int maxm=9+1e6;
const int N=9;
const int maxn=9+2e3;
bool solve1(const string& str, int k) {
for (int i = 0; i < k / 2; ++i) {
if (str[i] != str[k - 1 - i]) {
return false;
}
}
return true;
}
bool solve2(const string& str, int k) {
for (int i = 0; i <= str.size() - k; ++i) {
if (solve1(str.substr(i, k), k)) {
return true;
}
}
return false;
}
void solve() {
int n, k;
string s;
cin >> n >> k;
cin >> s;
sort(s.begin(), s.end());
int count = 0;
do {
if (!solve2(s, k)) {
count++;
}
} while (next_permutation(s.begin(), s.end()));
cout << count << endl;
}
int main() {
gkd;
cin.tie(0);
cout.tie(0);
int T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}