字符串的回文子序列个数

题目描述

求一个长度不超过15的字符串的回文子序列个数(子序列长度>=1)。


输入描述

输入一个长度不超过15的字符串,字符串均由小写字母表示


输出描述

输出其回文子序列个数


样例输入

 

abaa


样例输出

10


注释

本例中其所有回文子序列为:
a,b,a,a,aba,aba,aa,aa,aa,aaa
一个字符串的子序列是指在原字符串上去除某些字符但不破坏余下元素的相对位置(在前或在后)而形成的新字符串。

#include<iostream>
#include<string>

using namespace std;

string str,creat="";
int ans=-1;
bool used[20]={false};

bool back_forward(string str)
{
    for(int i=0;i<str.length()/2;i++)
    {
        if(str[i]!=str[str.length()-i-1]) 
            return false;
    }
    return true;
}

void search(int len, int start)
{
    if(len<=0)
    {
        if (back_forward(creat)) {/*cout<<creat<<endl;*/ans++;}
        return;
    }
    for(int i=start;i<str.length();i++)
    {
        if (!used[i])
        {
            used[i]=true;
            creat.append(str,i,1);
            search(len-1,i+1);
            used[i]=false;
            creat.erase(creat.length()-1,1);
        }
    }
}

int main(){
    cin>>str;
    for(int i=0;i<str.length();i++)
        search(i,0);
    if (back_forward(str)) {/*cout<<str<<endl;*/ans++;}
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2018-05-07 19:32  木樨  阅读(1610)  评论(2编辑  收藏  举报