含重复字符的字符串全排列算法(思路+分析)

本文探讨了如何解决含重复字符的字符串全排列问题。通过分析不含重复字符的递归算法失效原因,提出了新的解决方案:先对字符串排序,然后逐个复制不与前一个字符相同的字符到解空间,确保不会遗漏或重复解。虽然这种方法增加了排序和额外空间的使用,但能有效处理重复字符的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从昨天到现在一直在回顾字符串的全排列算法,之前简单地复习了不含重复字符的字符串全排列,所以这次想彻底解决该算法。关于不含重复字符的字符串全排列比较简单,直接用递归思路解决即可,简单代码如下:

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为简单地改进,希望可以解决含重复字符的字符串全排列。但是在上机运行后发现是行不通的。简单分析了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值