java - 从给定的字符串中获取所有可能的回文
问题描述
子字符串是字符串中连续的字符范围。
现在我需要找出可以重新排列的子串有多少可以形成回文。
例如:对于输入 - 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));
}
}
}
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
这个逻辑中的方法。
解决方案
有n(n+1)/2
可能的子字符串,对于每个子字符串,您检查它是否可以重新排列,以便它在给定子字符串的长度中形成回文,O(k)
让k
我们考虑是否有必要分别解析每个子字符串。
暗示:
假设您有从 index to 的子字符串,您对从 index top
的子字符串有k
什么看法。真的有必要单独解析这个扩展子串吗?p
k + 1
推荐阅读
- c# - 为什么 ASP.NET Core 只执行一次自定义中间件?
- php - 在 Woocommerce 中将特定类别中的产品的项目数量设置为“x”的倍数
- java - 如何使用 H2 数据库在 DataIntegrityViolationException 上获取约束名称?
- jquery - 按钮隐藏在 JQuery 中无法按预期工作
- visual-studio - 如何使用 WebJobs SDK 3.0 将针对 netcoreapp2.1 的 Web 作业从 Visual Studio 发布到 Azure
- node.js - 是否可以仅使用一个请求来获得两个 nodejs 服务器之间的 RTT 延迟?
- javascript - 如何从javascript中的对象获取特定的键值?
- google-cloud-platform - Google Cloud Dataflow 写入 BigQuery(错误 401:需要登录)
- python - 直接从命令行在 IDLE 窗口中运行文件
- android - Android Gradle 同步错误:读取超时