[100번] 제53번 문자열의 전체 배열

2357 단어
차례차례 해답을 구하다.
1) 각 원소를 순서대로 수위에 올리고 나머지 원소를 귀속시킨다
2) 현재 요소가 끝에 도달하면 이 시퀀스를 출력합니다
관건은 다음과 같다.
원소마다 교환이 끝난 후에 교환해야 한다.각 원소는 순서대로 수위를 차지하고,
for (int i=currentIndex; i<=n;+i) {swap는 i+1에서 swap으로 귀속됩니다}
 
#include<stdio.h>
#include<stdlib.h>
#define SWAP(x,y,t)((t)=(x),(x)=(y),(y)=(t))
int score=0;
void perm(int *list,int i,int n)
{
        int j,temp;
 
        if(i==n)
        {
            for(j=0;j<=n;j++)
            {
         printf("%d ",list[j]);
            }
            printf("
"); score++; } else { for(j=i;j<=n;j++) { SWAP(list[i],list[j],temp); perm(list,i+1,n); SWAP(list[i],list[j],temp); } } } int main() { int list[]={1,2,3}; perm(list,0,2); printf("Thetotal number is %d
",score); system("pause"); }

 
String 버전
 
#include <iostream>
using namespace std;
 
void Permutation(string pStr, int k, int n)
{
     if(k==n)
           cout<<pStr<<endl;
             
     for(int i=k;i<n;++i)
           {
                 swap(pStr.at(i),pStr.at(k));
                          Permutation(pStr, k+1,n);
                          swap(pStr.at(i),pStr.at(k));
                       
       }     
          
}
 
int main()
{
         strings="abcdef";
         Permutation(s,0,s.length());
}

 
2. 확장
만약 문자를 구하는 모든 배열이 아니라 문자를 구하는 모든 조합이라면 어떻게 해야 합니까?(P72)    
사고방식: 여기는 교환 방식이 아니라 삭제 방식을 채택한다.서로 다른 제거 순서를 사용하고prex로 삭제 값을 보류하면 조건에 부합되는 모든 서열을 얻을 수 있습니다
  
#include  <iostream>
using namespacestd;
voidselect(string str, string prex)
{
      string temp=str;
      cout<<prex<<endl;
      for(int i=0;i<str.length();++i)
           {
                   select(str.erase(i,1),prex+str.at(i));
               str=temp;
                       
        }     
          
}
 
int main()
{
          string s="abcd";
          select(s,"");
}

확장 2:
입력한 문자열에 같은 문자열이 있을 때, 같은 문자 교환 위치는 서로 다른 배열이지만 같은 조합이다.예를 들어 aaa를 입력하면 6개의 aaa가 배열되지만 대응하는 조합은 하나입니다.

좋은 웹페이지 즐겨찾기