对字符串

时间:2016-03-14 18:45:16

标签: c string algorithm combinations permutation

我有一个字符串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 

如果我要交换cb,则字符串将变为abcd。所以这意味着字符串acbdabcd的副本。

3. cabd

如果我要交换ca,则字符串将变为acbd,然后如果我交换cb,字符串将变为{{1} }}是abcd

的副本
abcd

2次互换后的此字符串也无法转换为4. dcab ,因此这不是abcd的副本。

我想知道的是,如果给我一个字符串abcd,那么有多少个字符串是str的排列,但在最大值之后无法转换为str两次互换。 我解决这个问题的方法是找到字符串str的所有排列,然后继续进行,但对于长度较大的字符串,它会失败。请帮忙,以便我可以解决这个问题。

4 个答案:

答案 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次交换,任何输入混乱的字符串(即bcdadcab等)都变得等同于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;
}

希望这有帮助。