비어 있지 않은 문자열이 있다고 가정합니다. 인코딩된 길이가 최소가 되도록 이 문자열을 인코딩해야 합니다.
인코딩 규칙은 − k[encoded_string]과 같으며, [ ] 안의coded_string이 정확히 k 번 반복됩니다. k는 양의 정수이고 인코딩된 문자열은 비어 있지 않거나 추가 공간이 없다는 점을 명심해야 합니다. 입력 문자열에 소문자만 포함되어 있다고 가정할 수 있습니다. 인코딩 프로세스가 문자열을 더 짧게 만들지 않으면 해당 문자열을 인코딩하지 마십시오.
따라서 입력이 "aaaaa"와 같으면 "5[a]"가 "aaaaa"보다 1자 짧기 때문에 출력은 "5[a]"가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 2D 배열 dp 정의
-
Collapse() 함수를 정의하면 s, i, j,
가 필요합니다. -
temp :=인덱스에서 s의 부분 문자열(i에서 j - i까지)
-
x :=temp는 temp와 연결
-
pos =x의 온도 위치
-
만약 pos>=온도의 크기라면 -
-
반환 온도
-
-
(temp/pos의 크기)를 문자열로 반환한 다음 '[' concatenate dp[i,i+pos-1]concatenate ']'
-
encode() 함수를 정의하면 s가 소요됩니다.
-
n :=s
의 크기 -
dp :=n x n 크기의 2D 배열 하나 정의
-
초기화 l :=1의 경우, l <=n일 때 업데이트(l을 1만큼 증가), 수행 -
-
initialize i :=0, j :=l - 1, j
-
dp[i, j] :=인덱스 i에서 j까지 s의 부분 문자열 - i
-
초기화 k :=i의 경우 k
-
온도 :=dp[i, k] + dp[k + 1, j]
-
temp의 크기
-
dp[i, j] :=온도
-
-
-
rep :=접기(s, i, j)
-
rep의 크기 <=dp[i, j]의 크기이면 -
-
dp[i, j] :=rep
-
-
-
-
반환 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]"