子字符串是字符串中连续的字符范围。
现在,我需要找出多少个可以重新排列的子串可以形成回文。
例如:输入-aabb
a
aa
aab (because after re-arranging it becomes aba)
aabb (because after re-arranging it becomes abba)
a
abb (because after re-arranging it becomes bab)
b
bb
b
So we have 9 substring palindromes.
这是我尝试的代码:
public static int getPalindromeCount(String str) {
// all single characters are treated as palindrome
int count = str.length();
// Get all sub strings
List<String> subs = new ArrayList<>();
subString(str, subs);
for (String sub : subs) {
String rev = new StringBuilder(sub).reverse().toString();
if (rev.equals(sub)) {
System.out.println(sub);
count++;
} else {
boolean valid = isPalindrome(sub);
System.out.println(sub + " : " + valid);
if (valid) {
count++;
}
}
}
return count;
}
// Check if substring can form a Palindrome
private static boolean isPalindrome(String input) {
Set<Character> oddChars = new HashSet<>();
for (char c : input.toCharArray()) {
if (!oddChars.add(c)) {
oddChars.remove(c);
}
}
return oddChars.size() <= 1;
}
// Get all substrings
private static void subString(String input, List<String> list) {
for (int i = 0; i < input.length(); i++) {
for (int j = i + 2; j <= input.length(); j++) {
list.add(input.substring(i, j));
}
}
}
我从这篇帖子Check if a permutation of a string can become a palindrome中学到的方法isPalindrome
的逻辑部分
此代码可以正常工作,但是由于超时错误而失败。
我不确定这些输入有哪些失败,因为它们隐藏在我的hackerrank挑战中。
编辑:
我已经修改了getPalidromeCount
方法,以检查输入中有多少个奇数个字母来确定回文数。
这是基于对此信息的评论:
提示:回文由所有偶数个或全部字母组成 偶数字母和一个奇数字母(中间 字符)。现在,您可以轻松计算出可能的回文数。 – vivek_23
public static int getPalindromeCount(String str) {
List<Integer> list = new ArrayList<>(strToEvaluate.size());
for (String str : strToEvaluate) {
int count = str.length();
List<String> subs = new ArrayList<>();
subString(str, subs);
for (String sub : subs) {
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < sub.length(); i++) {
char c = sub.charAt(i);
map.put(c, map.getOrDefault(c, 0) + 1);
}
int odds = 0;
for (char key : map.keySet()) {
if (map.get(key) % 2 != 0) {
odds++;
if (odds > 1) {
break;
}
}
}
if (odds <= 1) {
System.out.println(sub);
count++;
}
list.add(count);
}
}
return list;
}
但是我仍然看到超时错误。我没有在这种逻辑中使用isPalindrome
方法。
答案 0 :(得分:4)
有n(n+1)/2
个可能的子字符串,对于每个子字符串,请检查是否可以重新排列,以便在O(k)
中形成回文,其中k
是给定子字符串的长度,让我们考虑是否有必要分别解析每个子字符串。
假设您有一个从索引p
到k
的子字符串,那么对于从索引p
到k + 1
的子字符串您能说什么。真的有必要单独解析此扩展子字符串吗?
答案 1 :(得分:0)
代码:
class Solution{
public static long getPalindromeCount(String s) {
long cnt = 0,len = s.length();
for(int i=0;i<len;++i){
int[] hash = new int[26];
cnt++; // since 1 character is palindrome anyway
for(int j=i+1;j<len;++j){
hash[s.charAt(j)-'a']++;
if(palindromePossible(hash)) cnt++;
}
}
return cnt;
}
private static boolean palindromePossible(int[] hash){
int odd_cnt = 0;
for(int i=0;i<hash.length;++i){
if(hash[i] % 2 != 0) odd_cnt++;
}
return odd_cnt < 2;
}
public static void main(String[] args){
System.out.println(getPalindromeCount("aabb"));
}
}