leetcode1177. 构建回文串检测(前缀和)
給你一個字符串 s,請你對 s 的子串進行檢測。
每次檢測,待檢子串都可以表示為 queries[i] = [left, right, k]。我們可以 重新排列 子串 s[left], …, s[right],并從中選擇 最多 k 項替換成任何小寫英文字母。
如果在上述檢測過程中,子串可以變成回文形式的字符串,那么檢測結果為 true,否則結果為 false。
返回答案數組 answer[],其中 answer[i] 是第 i 個待檢子串 queries[i] 的檢測結果。
注意:在替換時,子串中的每個字母都必須作為 獨立的 項進行計數,也就是說,如果 s[left…right] = “aaa” 且 k = 2,我們只能替換其中的兩個字母。(另外,任何檢測都不會修改原始字符串 s,可以認為每次檢測都是獨立的)
示例:
輸入:s = “abcda”, queries = [[3,3,0],[1,2,0],[0,3,1],[0,3,2],[0,4,1]]
輸出:[true,false,false,true,true]
解釋:
queries[0] : 子串 = “d”,回文。
queries[1] : 子串 = “bc”,不是回文。
queries[2] : 子串 = “abcd”,只替換 1 個字符是變不成回文串的。
queries[3] : 子串 = “abcd”,可以變成回文的 “abba”。 也可以變成 “baab”,先重新排序變成 “bacd”,然后把 “cd” 替換為 “ab”。
queries[4] : 子串 = “abcda”,可以變成回文的 “abcba”。
代碼
class Solution {int[][] t;public List<Boolean> canMakePaliQueries(String s, int[][] queries) {int n=s.length();List<Boolean> res=new ArrayList<>();t=new int[n+1][26];for (int i=1;i<=n;i++)//字符個數的前綴和{int cur=s.charAt(i-1)-'a';t[i]=t[i-1].clone();t[i][cur]++;}for(int[] c:queries)res.add(getCanMakePaliQueries(s,c[0],c[1])<=c[2]);return res;}public int getCanMakePaliQueries(String s, int l,int r) { //統計區間內組成回文需要改變的字符個數int res=0;int[] helper=new int[26];for(int i=0;i<26;i++){int c=t[r+1][i]-t[l][i];if(c%2==1)res++;}return res/2;} }總結
以上是生活随笔為你收集整理的leetcode1177. 构建回文串检测(前缀和)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到死人回来找我什么意思
- 下一篇: leetcode151. 翻转字符串里的