2019 爱奇艺校招笔试题 平方串

    xiaoxiao2022-07-05  165

    如果一个字符串S是由两个字符串T连接而成,即S = T + T, 我们就称S叫做平方串,例如"","aabaab","xxxx"都是平方串. 牛牛现在有一个字符串s,请你帮助牛牛从s中移除尽量少的字符,让剩下的字符串是一个平方串。换句话说,就是找出s的最长子序列并且这个子序列构成一个平方串。

    输入描述:

    输入一个字符串s,字符串长度length(1 ≤ length ≤ 50),字符串只包括小写字符。

    输出描述:

    输出一个正整数,即满足要求的平方串的长度。

    示例1

    输入

    frankfurt

    输出

    4

    这道题目将前半部分和后半部分分开,转化为最长公共子序列问题,求解,时间复杂度O(N^2* N)  

    #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; // 求str1和str2的最长公共子序列 int LCS(string str1, string str2) { // dp[i][j] 表示str1的前i个字符和str2的前j个字符构成的最长公共子序列长度 vector<vector<int>> dp(str1.size()+1,vector<int>(str2.size()+1,0)); int res = 0; for(int i=1;i<=str1.size();i++){ for(int j=1;j<=str2.size();j++){ if(str1[i-1]==str2[j-1]){ dp[i][j] = dp[i-1][j-1]+1; } else{ dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } res = max(res,dp[i][j]); } } return res; } int main() { string str; cin>>str; int temp,res=0; for(int i=1;i<str.size();i++){ temp = LCS(str.substr(0,i),str.substr(i,str.size()-i)); res = max(temp,res); } cout<<2*res<<endl; }

     

    最新回复(0)