我有两个字符串,我想知道任何子字符串获得原始字符串的最小旋转/反转次数。
示例:
两个字符串是:
abcdef
abdcfe
在第二个字符串的上方,子字符串dc
可以旋转得到abcdfe
。然后旋转下一个fe
以得到abcdef
。因此,最小旋转数为2。如果无法解决,那么我需要获得-1
。
为了解决这个问题,我想到了getting all permutations of input string,所以我可以决定哪里有可能的结果或返回-1。但是我看到这不是正确的方法,因为我找不到最小的旋转数。
解决此问题的方法是什么。
答案 0 :(得分:1)
一种解决方法(虽然不确定是否足够有效):
您可以将其想象为有向树状图,最初在根中有您的字符串,然后您可以做的所有可能的操作都是边,而在节点中则有转换后的字符串。您正在通过广度优先搜索它。
例如这样的例子:
const reverse = str => Array.from(str).reverse().join('');
function subreverse(str, from, to) {
const before = str.substring(0, from);
const reversed = reverse(str.substring(from, to+1));
const end = str.substring(to+1);
return `${before}${reversed}${end}`;
}
// generates all possible substring-reverse transformation from given string
function findNewStrings(original) {
const strLen = original.length;
const newStrings = [];
for (let i=1; i < strLen; i++) {
for (let j=0; j < strLen - i; j++){
newStrings.push(subreverse(original, j, j+i));
}
}
return newStrings;
}
function findRotations(original, transformed) {
let solution = undefined;
let stack = [];
let newStack = [];
let iterations = 0;
// using stack for BFS-like alghoritm
stack.push({str: original, rotations: 0, history: original});
// iterations is just to ensure that in case of some bug it will not end in endless loop
while (!solution && iterations < 10) {
iterations++;
stack.forEach(item => {
const newStrings = findNewStrings(item.str);
newStrings.forEach(str => newStack.push(
{str, rotations: item.rotations+1, history: `${item.history}->${str}`}));
})
solution = newStack.find(item => item.str === transformed);
stack = newStack;
}
return solution;
}
console.log(findRotations('abcdef', 'abcdfe'));
console.log(findRotations('abcdef', 'abdcfe'));
console.log(findRotations('abcdefgh', 'ghabdcfe'));
答案 1 :(得分:0)
首先,可行性检查很简单:对两个字符串进行排序并检查它们是否相等。
将问题分解为子问题:寻找具有相同字母的子字符串,并在正确位置以字母为界。就您而言,您可以将其分为三部分:ab
(完成),cd/dc
和ef/fe
。如果找到,则分别解决每个问题。
您最终的解决方案将涉及递归搜索解决方案空间。现在就开始考虑:
请注意,字符串的长度是任何解决方案路径的上限。
那应该让您感动。请注意,您可以应用启发式方法来识别可能的路径。例如,计算每个字母的位移(必须将其移动多远)。如果您有大量相似的值,则表示轮换。如果您一侧的值为负,而另一侧的值为正,则表示逆转。
那应该让你动起来。