[英]How can I solve this dynamic programing problem?
我在學習動態規划時遇到了一個問題。
我有一串數字。 您需要找到該字符串中具有前半部分數字和后半部分數字之和的子字符串的最長子字符串的長度。
例如,
輸入字符串:142124
輸出:6
當輸入字符串為“142124”時,前半部分(142)和后半部分(124)的個數之和是相同的,所以整個給定的字符串成為我們找到的最長子字符串。 因此,輸出為 6,即整個字符串的長度。
輸入字符串:9430723
輸出:4
該字符串中具有前半部分和后半部分之和的最長子字符串變為“4307”。
我這樣解決了這個問題
int maxSubStringLength(char* str){
int n = strlen(str);
int maxLen = 0;
int sum[n][n];
for(int i=0; i<n; i++)
sum[i][i] = str[i] - '0';
for(int len =2; len <=n; len++){
for(int i = 0; i < n - len + 1; i++){
int j = i + len - 1;
int k = len / 2;
sum[i][j] = sum[i][j-k] + sum[j-k+1][j];
if(len%2 == 0 && sum[i][j-k] == sum[j-k+1][j] && len > maxLen)
maxLen = len;
}
}
return maxLen;
}
這段代碼的時間復雜度為 O (n * n),空間復雜度為 O (n * n)。
然而,這個問題需要用O (1) 空間復雜度和O (n * n) 時間復雜度來解決。
用O(1)的空間復雜度可以解決這個問題嗎?
您可以使用 O(1) 空間復雜度和 O(n^2) 時間復雜度輕松解決此問題。
這是一種方法:
從 m = 0 到 n-2。 這表示字符串的中間(在第 m 個字符后拆分)。
對於 i = 1 到 n(如果越界則中斷)。 建立左右和,如果它們相等,將 i 與迄今為止最好的進行比較,如果更好則更新它。
解是最好的 2 倍(因為它表示半串)。
在 Java 中,它會是這樣的:
public int maxSubstringLength(String s) {
int best = 0;
for (int m = 0; m < s.length() - 1; m++) {
int l = 0; // left sum
int r = 0; // right sum
for (int i = 1; m - i + 1 >= 0 && m + i < s.length(); i++) {
l += s.charAt(m - i + 1);
r += s.charAt(m + i);
if (l == r && i > best)
best = i;
}
}
return 2 * best;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.