我有一个字符串abcd
所以它的所有排列都是
abcd bacd cabd dabc
abdc badc cadb dacb
acbd bcad cbad dbac
acdb bcda cbda dbca
adbc bdac cdab dcab
adcb bdca cdba dcba
但是在这24种排列中,abcd
中唯一“全等”的排列最多可以应用2次,以恢复为abcd
。通过交换我的意思是我可以交换两个字符,这些字符可以是字符串中的任意两个字符。让我通过例子解释
1. abcd
由于abcd
已经是abcd
的副本,因此不需要交换任何字符。
2. acbd
如果我要交换c
和b
,则字符串将变为abcd
。所以这意味着字符串acbd
是abcd
的副本。
3. cabd
如果我要交换c
和a
,则字符串将变为acbd
,然后如果我交换c
和b
,字符串将变为{{1} }}是abcd
。
abcd
2次互换后的此字符串也无法转换为4. dcab
,因此这不是abcd
的副本。
我想知道的是,如果给我一个字符串abcd
,那么有多少个字符串是str
的排列,但在最大值之后无法转换为str
两次互换。
我解决这个问题的方法是找到字符串str的所有排列,然后继续进行,但对于长度较大的字符串,它会失败。请帮忙,以便我可以解决这个问题。
答案 0 :(得分:1)
这是两个字符串之间距离的示例。当两者具有相同的长度时,可以执行简单的汉明距离计算。参见
https://en.wikipedia.org/wiki/Hamming_distance
对于不同长度的琴弦,请使用Damerau-Levenshtein距离。参见
https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
我在牌照识别应用程序中使用后者,以便在一个或两个角色关闭时最大限度地减少漏报。
答案 1 :(得分:0)
既然你问过这个方法,我就是在数学的角度来回答。评论任何进一步的帮助。
我的理解:
即使在2 swaps
之后,您也需要查找不可交换的字符串。
显而易见的方法是
找到至少3 characters
不在其原始分配位置且未直接交换的{{1}}
答案 2 :(得分:0)
如果你只需要一个计数,并假设所有字符都是唯一的,那么从一个交换之后的构建字符串开始:选择任意两个位置并交换字符。这会产生n*(n-1)/2
个字符串。
要构建字符串两个交换,将相同的过程应用于上面构建的字符串 - 但不要触摸已交换的字符 - 并过滤掉重复项。每个字符串都会产生(n-2)*(n-3)/2
个结果,每个结果都是通过2个路径到达的,给出n*(n-1)*(n-2)*(n-3)/8
。
总计为1 + n*(n-1)/2 + n*(n-1)*(n-2)*(n-3)/8
。
答案 3 :(得分:0)
如果我理解你的问题,你想以任意顺序检查混乱的abcd
字符串。
在这里,您要检查是否至少有2次交换,任何输入混乱的字符串(即bcda
,dcab
等)都变得等同于abcd
。
以下是您可以尝试的示例代码。
string Swap(string str, int i, int j)
{
char temp = str[i];
str[i] = str[j];
str[j] = temp;
return str;
}
bool IsStringCompareable(string sourceString, string destinationString)
{
int stringLength = sourceString.length();
int swapCount = 0;
for(int i = 0; i < stringLength; i++)
{
if(sourceString[i] != destinationString[i])
{
for(int j = i+1; j < stringLength; j++)
{
if(sourceString[i] == destinationString[j])
{
destinationString = Swap(destinationString, i, j);
swapCount++;
break;
}
}
if(swapCount > 2)
{
return false;
}
if(sourceString == destinationString)
{
return true;
}
}
}
}
int main()
{
string sourceString = "abcd";
// Here you can modify the destination string to take any input.
string destinationString = "bcda";
bool flag = IsStringCompareable(sourceString, destinationString);
cout << flag;
}
希望这有帮助。