Leet Palindrome Partitioning II
7468 단어 partition
1 class Solution {
2 public:
3 int minCut(string s) {
4 int len = s.length();
5 int* p_dp = new int[len + 1];
6 char* s_dp = new char[len * len];
7 int* mm = new int[len + 1];
8 mm[0] = 0;
9 memset(s_dp, -1, len * len);
10 memset(p_dp, 0, (len + 1) * sizeof(int));
11
12 int ret;
13 for (int i=1; i<=len; i++) {
14 int sub_len = i;
15 int minc = INT_MAX;
16
17 for (int j=0; j<=i-1; j++, sub_len--) {
18
19 char* p_is = &s_dp[j * len + i-1];
20 char b = 0;
21 if (sub_len >= 3 && -1 != (b = s_dp[(j+1) * len + i - 2])) {
22 *p_is = b && (s[j] == s[j + sub_len - 1]);
23 }
24 if (*p_is == -1) {
25 int p = j, q = j + sub_len - 1;
26 for (; p < q && s[p] == s[q]; p++, q--);
27 *p_is = (p < q) ? 0 : 1;
28 }
29 if (*p_is == 0) continue;
30 if (p_dp[j] < minc) minc = p_dp[j];
31 if (minc == mm[j]) break;
32 }
33 p_dp [i] = minc + 1;
34 mm[i] = p_dp[i];
35 for (int k = i-1; k >=0 && mm[k]>mm[k+1]; k--) {
36 mm[k] = mm[k+1];
37 }
38 }
39 ret = p_dp[len];
40 delete[] mm;
41 delete[] p_dp;
42 delete[] s_dp;
43 return ret - 1;
44 }
45 };
원래 앞의 문제에서 dp와 비슷한 방법을 생각해 냈으니 이 문제는 더욱 간단해야 한다고 생각했는데...하지만...회문의 착과 과정을 판단하는 데 최적화를 하지 않고 TLE를 계속 고려했다. 이를 고려한 후에 통과할 수 있다. 여기서 문자열이 회문인지 아닌지를 구하는 과정과 최소 분할을 구하는 과정을 합쳤다. 그리고 더 작은 분할이 있을 수 없는 상황에서 다음 순환 과정으로 빠르게 들어가는 비극적인 하루를 고려했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux의 i-node, 파티션, 파일 시스템 및 마운트 복습2차 저장 장치 내의 파일의 실제 데이터 위치.↑ 파일 자체의 정보가 있는 곳. (즉, 여러 개의 파일 이름을 추가해도 모든 파일 이름이 가리키는 i-number는 같다) 디렉토리에는 파일 이름과 i-number에 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.