Leetcode - Palindrome Permutation II

本文介绍了一种生成字符串所有可能的回文排列的方法,并提供了两种实现思路。首先判断字符串是否能形成回文串,接着通过不同策略构造回文串的所有排列,包括递归构造和直接构造前半部分。
Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form.

For example:

Given s = "aabb", return ["abba", "baab"].

Given s = "abc", return [].

[分析]
先按照Palindrome Permutation 的方法判断输入字符串 s 能否排列成为一个回文串。通过检查开始构造过程,有两个思路:
思路1:按照leetcode的提示,我们仅需构造回文的前半部分。先利用前面判断过程中的map获得回文前半部分所有的字符,相同字符排列在一起,然后按照Permutation II一题的思路获得前半部分所有的排列情况,最后组合回文的前后部分加入结果集。
思路2:从中间往两端递归构造回文串。

[ref]
[url]https://leetcode.com/discuss/53638/0ms-easy-c-solution[/url]
[url]https://leetcode.com/discuss/53613/my-accepted-java-solution[/url]


public class Solution {
// Method 1
public List<String> generatePalindromes(String s) {
List<String> ret = new ArrayList<String>();
if (s == null || s.length() == 0) return ret;
if (s.length() == 1) {ret.add(s); return ret;}
int[] map = new int[256];
for (int i = 0; i < s.length(); i++)
map[s.charAt(i)]++;
int oddCount = 0;
int oddIdx = -1;
StringBuilder half = new StringBuilder();
for (int i = 0; i < 256; i++) {
if ((map[i] & 1) == 1) {
oddIdx = i;
oddCount++;
if (oddCount == 2) return ret;
}
int halfCount = map[i] / 2;
for (int j = 0; j < halfCount; j++)
half.append((char)i);
}
List<String> halfPermutation = new ArrayList<String>();
getPermutation(half.toString().toCharArray(), new boolean[half.length()], new StringBuilder(), halfPermutation);
for (String curr : halfPermutation) {
StringBuilder curr2 = new StringBuilder(curr);
if (oddIdx != -1)
curr += (char)oddIdx;
ret.add(curr + curr2.reverse().toString());
}
return ret;
}

public void getPermutation(char[] chars, boolean[] used, StringBuilder item, List<String> result) {
if (item.length() == chars.length) {
result.add(item.toString());
} else {
for (int i = 0; i < chars.length; i++) {
if (used[i] || (i > 0 && chars[i] == chars[i - 1] && !used[i - 1]))
continue;
item.append(chars[i]);
used[i] = true;
getPermutation(chars, used, item, result);
used[i] = false;
item.deleteCharAt(item.length() - 1);
}
}
}
// Method 2
public List<String> generatePalindromes2(String s) {
List<String> ret = new ArrayList<String>();
int[] map = new int[256];
for (int i = 0; i < s.length(); i++)
map[s.charAt(i)]++;
int oddCount = 0;
int oddIdx = -1;
for (int i = 0; i < 256; i++) {
if ((map[i] & 1) == 1) {
oddIdx = i;
oddCount++;
if (oddCount == 2) return ret;
}
}
String curr = "";
if (oddIdx != -1) {
curr += (char)oddIdx;
map[oddIdx]--;
}
dfs(curr, map, s.length(), ret);
return ret;
}
public void dfs(String curr, int[] map, int n, List<String> ret) {
if (curr.length() < n) {
for (int i = 0; i < map.length; i++) {
if (map[i] > 0) {
curr = (char)i + curr + (char)i;
map[i] -= 2;
dfs(curr, map, n, ret);
curr = curr.substring(1, curr.length() - 1);
map[i] += 2;
}
}
} else {
ret.add(curr);
}
}
}
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问题,并提供完整的Matlab代码实现。文章结合数据驱动方法与Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模与线性化处理,从而提升纳米级定位系统的精度与动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计与优化,适用于高精度自动化控制场景。文中还展示了相关实验验证与仿真结果,证明了该方法的有效性和先进性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模与线性化提供一种结合深度学习与现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模与模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注数据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统数据进行迁移验证,深化对方法泛化能力的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值