动态规划
删去一个字符的话,dp[i][1] = s[i] == s[i - 1] ? dp[i - 1][1] : dp[i - 1][0] + dp[i - 1][1];
删去两个字符的时候,分三种情况讨论,分析dp[i][2]的s[i]、s[i-1]、s[i-2]的字符abc是abb、bab、abc的那一类模式
Pabb:Pab删1【s[i]删除】+Pab删2【s[i]不删除】-重复加的情况【Pa删1】
Pbab:Pab删1【s[i]删除】+Pab删2【s[i]不删除】-重复加的情况【Pb】
Pabc:Pab删1【s[i]删除】+Pab删2【s[i]不删除】此时无重复情况
#include<iostream>
#include<string>
using namespace std;
string s; int Len;
long long int dp[1000005][3];
int main() {
cin >> s, Len = s.size();
for (int i = 0; i < Len; ++i) dp[i][0] = 1;
dp[0][1] = 1;
for (int i = 1; i < Len; ++i) dp[i][1] = s[i] == s[i - 1] ? dp[i - 1][1] : dp[i - 1][0] + dp[i - 1][1];
dp[1][2] = 1;
for (int i = 2; i < Len; ++i)
if(s[i] == s[i - 1]) dp[i][2] = dp[i - 1][1] + dp[i - 1][2] - dp[i-2][1];
else if (s[i] == s[i - 2]) dp[i][2] = dp[i - 1][1] + dp[i - 1][2] - 1;
else dp[i][2] = dp[i - 1][1] + dp[i - 1][2];
cout << dp[Len - 1][0] + dp[Len - 1][1] + dp[Len - 1][2] << endl;
}