从昨天到现在一直在回顾字符串的全排列算法,之前简单地复习了不含重复字符的字符串全排列,所以这次想彻底解决该算法。关于不含重复字符的字符串全排列比较简单,直接用递归思路解决即可,简单代码如下:
template <class T>
void permute(T list[],int k, int m)
{
int i;
if (k==m)
{
for (i=0;i<=m;i++)
cout<<list[i];
cout<<endl;
}
for (i=k;i<=m;i++)
{
//if (list[k]!=list[i]&&i!=k) //方法1:如果不同位置上的字符不相同,则进行交换
//{
// if ( IsSwap(list+i,list+m))//方法2:如果从该字符起,在区间[pBegin , pEnd)上没有重复字符,则进行交换,参考http://blog.youkuaiyun.com/hackbuteer1/article/details/7462447
// {
lswap(list+k,list+i);
permute(list,k+1,m);
lswap(list+i,list+k);
//}
}
//}
}
template <class T>
inline bool IsSwap(T* pBegin , T* pEnd)
{
T *p;
for(p = pBegin ; p < pEnd ; p++)
{
if(*p == *pEnd)
return false;
}
return true;
}
但是上述方法在存在重复字符的情况下则失效。上述代码中方法1和方法2为简单地改进,希望可以解决含重复字符的字符串全排列。但是在上机运行后发现是行不通的。简单分析了