diff --git a/Dynamic_Programming/2472.Maximum-Number-of-Non-overlapping-Palindrome-Substrings/2472.Maximum-Number-of-Non-overlapping-Palindrome-Substrings.cpp b/Dynamic_Programming/2472.Maximum-Number-of-Non-overlapping-Palindrome-Substrings/2472.Maximum-Number-of-Non-overlapping-Palindrome-Substrings.cpp new file mode 100644 index 000000000..e35670f24 --- /dev/null +++ b/Dynamic_Programming/2472.Maximum-Number-of-Non-overlapping-Palindrome-Substrings/2472.Maximum-Number-of-Non-overlapping-Palindrome-Substrings.cpp @@ -0,0 +1,32 @@ +class Solution { + int isPalin[2001][2001]; +public: + int maxPalindromes(string s, int k) + { + int n = s.size(); + for (int i=0; idp(n); + for (int i=k-1; i& nums) + { + int i = 0, j = nums.size()-1; + LL left = nums[i], right = nums[j]; + int count = 0; + + while (i right) + { + j--; + right += nums[j]; + count++; + } + } + return count; + + } +}; diff --git a/Two_Pointers/2422.Merge-Operations-to-Turn-Array-Into-a-Palindrome/Readme.md b/Two_Pointers/2422.Merge-Operations-to-Turn-Array-Into-a-Palindrome/Readme.md new file mode 100644 index 000000000..7ff199e20 --- /dev/null +++ b/Two_Pointers/2422.Merge-Operations-to-Turn-Array-Into-a-Palindrome/Readme.md @@ -0,0 +1,7 @@ +### 2422.Merge-Operations-to-Turn-Array-Into-a-Palindrome + +我们可以设想,最终得到的回文串的最左边和最右边的元素是怎么得到的?一定是来自nums最左侧的若干个元素之和,与nums最右侧的若干个元素之和。考虑到所有的元素都是正数,我们可以用双指针的方法来得到two equal sum。也就是说,初始令`left=nums[0]`和`right=nums[n-1]`,如果发现`leftright`,必然只能将右指针左移才能试图让left与right相等。于是在得到`left==right`之前,两侧指针移动的总次数就是merge的次数。此时,说明我们找到了最终回文串的最外层的一对。剥离掉这最外层后,我们可以重复上述的过程。 + +此外,我们必须考虑到,有可能在左右指针相遇之前,都无法满足`left==right`。这意味着什么呢?说明只有一个方案,即将整个数组都归并在一起,成为回文串的中心。 + +总结:所以本题就是一个双指针,不停地调整左右指针,试图使得前缀和等于后缀和。如此一轮一轮地确定外层的每一对。如果最终指针相遇,意味着该轮的所有元素必须都归并在一起。

AltStyle によって変換されたページ (->オリジナル) /