説明:
文字列を考えると 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
、我々は文字だけの2を置き換えることができます。(また、初期文字列があることに注意してください s
任意のクエリによって変更されることはありません。)
例:
入力:S = "ABCDA"、クエリ= [3,3,0]、[1,2,0]、[0,3,1]、[0,3,2]、[0,4,1] ] 出力:[真、偽、偽、真、真] 説明: クエリ[0]:サブ= "d"は、palidromeです。 クエリは、[1]:サブ= "BC"、palidromeされていません。 クエリは、[2]:サブ= "ABCD"、唯一の1文字を交換した後palidromeされていません。 クエリ[3]:サブストリング=「ABCD」は、palidromeある「アバ」に変更することができます。また、これは最初の「AB」と「CD」を置き換え、その後「BACD」それを再配置「BAAB」に変更することができます。 クエリ[4]:サブストリング= "ABCDA"は、palidromeある"ABCBA"に変更することができます。
制約:
1 <= s.length, queries.length <= 10^5
0 <= queries[i][0] <= queries[i][1] < s.length
0 <= queries[i][2] <= s.length
s
小文字のみ英語の文字が含まれています。
溶液:
Attempt1:
一つのテストケースの失敗、タイムアウト例外:
クラスソリューション{ パブリックリスト<ブール> canMakePaliQueries(文字列s、int型[] []クエリー){ 場合(クエリ== NULL || S ==のヌル || s.length()== 0 || queries.length == 0 ||クエリ[0] .LENGTH == 0 ){ 戻り ヌル。 } リスト <ブール>リスト= 新しいのArrayList <ブール> (); 以下のために(int型、iはqueries.lengthを<; I = 0 iは++ ){ 文字列TMP = "" ; int型 ST =クエリ[I] [0 ]; INT EN =クエリ[I] [1]; int型 K =クエリ[I] [2 ]。 ブーリアンテスト= isPalindrome2(s.substring(ST、EN + 1 )、K); list.add(テスト)。 } 戻りリスト。 } / * パブリックブールisPalindrome(文字列s、int型K){ INT = 0始めます。 INT端= s.length() - 1; INT回= 0; 一方、{(<終わりを始める) 場合(s.charAtは(開始)= s.charAt(エンド)!){ IF(回<K){ 回=回+ 1。 } 他{ falseを返します。 } } ++始めます。 終わり - ; } trueを返します。 } * / パブリック ブール isPalindrome2(文字列s、int型K){ int型のカウント= 0 ; HashMapの <文字、整数>マップ= 新しい HashMapの<> (); 以下のために(int型私= 0; i)が(s.lengthを<;私は++ ){ 場合(!{map.containsKey(s.charAt(I))) int型の TMP = カウント(S、s.charAt(I)); もし(TMP%2!= 0 ){ map.put(s.charAt(I)、TMP)。 } } } System.out.println(S + " "+ s.length()+"" + map.size())。 もし(s.length()%2 == 0 ){ 場合(map.size()/ 2 <= K) を返す 真。 } 他{ 場合(map.size()/ 2-1 < K){ 戻り 真。 } } を返す 偽。 } 公共 int型の数(文字列s チャーA){ int型のカウント= 0 ; 以下のために(int型I = 0; i)は(s.lengthを<; 私は++ ){ 場合(s.charAt(I)== A){ カウント ++ 。 } } リターン回数、 } }