用C ++编码最短长度的字符串
假设我们有一个非空字符串;我们必须对该字符串进行编码,以使其编码长度最小。
编码规则类似于−k[encoded_string],其中[]内的encode_string被精确重复k次。我们必须记住,k将是一个正整数,并且编码的字符串将不会为空或有多余的空间。我们可以假设输入字符串仅包含小写字母。如果编码过程没有使字符串变短,则不要对该字符串进行编码。
因此,如果输入类似于“aaaaa”,则输出将为“5[a]”,因为“5[a]”比“aaaaa”短1字符。
为了解决这个问题,我们将遵循以下步骤-
定义一个2D数组dp
定义一个函数collapse()
,它将取s,i,j,
temp:=s的子串从索引(i到j-i)
x:=temp与temp连接
pos=x中温度的位置
如果pos>=temp的大小,则-
返回温度
以字符串形式返回(temp/pos的大小),然后连接'['并连接dp[i,i+pos-1]并连接']'
定义一个函数encode()
,需要s,
n:=s的大小
dp:=定义一个大小为nxn的2D数组
对于初始化l:=1,当l<=n时,更新(将l增加1),-
dp[i,j]:=s的子串,从索引i到j-i
对于初始化k:=i,当k<j时,更新(将k增加1),-
rep:=崩溃(s,i,j)
如果rep的大小<=dp[i,j]的大小,则-
dp[i,j]:=温度
temp:=dp[i,k]+dp[k+1,j]
如果temp的大小<dp[i,j]的大小,则-
dp[i,j]:=rep
对于初始化i:=0,j:=l-1,当j<n时,更新(i增加1),(j增加1),-
返回dp[0,n-1]
例
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: vector<vector<string>> dp; string collapse(string &s, int i, int j) { string temp = s.substr(i, j - i + 1); string x = temp + temp; auto pos = x.find(temp, 1); if (pos >= temp.size()) return temp; return to_string((temp.size() / pos)) + "[" + dp[i][i + pos - 1] + "]"; } string encode(string s) { int n = s.size(); dp = vector<vector<string>>(n, vector<string>(n, "")); for (int l = 1; l <= n; l++) { for (int i = 0, j = l - 1; j < n; i++, j++) { dp[i][j] = s.substr(i, j - i + 1); for (int k = i; k < j; k++) { string temp = dp[i][k] + dp[k + 1][j]; if (temp.size() < dp[i][j].size()) { dp[i][j] = temp; } } string rep = collapse(s, i, j); if (rep.size() <= dp[i][j].size()) { dp[i][j] = rep; } } } return dp[0][n - 1]; } }; main() { Solution ob; cout << (ob.encode("bbbbbbbbbb")); }
输入值
"bbbbbbbbbb"
输出结果
"10[b]"