Permutation 전체 정렬

1903 단어

귀속 해결 전체 배열(소급법)


회소법의 사고방식도 이해하기 어렵지 않다.어떻게 귀속되는지 고찰하자, 1234를 예로 들자.우선 1위를 고려해야 한다. 이로써 후속 요소와 교환하여 2-134, 3-214, 4-231을 얻을 수 있다.그리고 다음 세 자리를 차례로 호출하면 된다.교환할 수 없는 (한 분만 남았음) 으로 돌아가면 출력합니다.
class Solution1{
public:
    vector permute(string s){
        vector result;
        helper(result, s, 0);
        return result;
    }

    void helper(vector& result, string& s, int index){
        if(index == s.size()-1)
            result.push_back(s);
        for(int i = index; i

반복 요소 고려하기


전체 배열은 첫 번째 숫자부터 각각 그 뒤의 숫자와 교환되기 때문이다.우리는 먼저 이런 판단을 덧붙여 보았다. 만약 한 수가 뒤의 숫자와 같다면 이 두 수는 교환되지 않을 것이다.예를 들어 122에서 첫 번째 숫자와 뒤의 숫자는 212, 221로 교환된다.그리고 122에서 두 번째 수는 세 번째 수와 교환할 필요가 없지만 212에 대해서는 두 번째 수와 세 번째 수는 같지 않고 교환한 후에 221을 얻는다.122에서 첫 번째 수와 세 번째 수를 교환하여 얻은 221과 중복되었다.그래서 이 방법은 안돼.
다른 사고방식으로 122에 대해 첫 번째 수 1과 두 번째 수 2를 교환한 다음에 첫 번째 수 1과 세 번째 수 2를 교환하는 것을 고려한다. 이때 세 번째 수는 두 번째 수와 같기 때문에 첫 번째 수는 세 번째 수와 교환하지 않는다.다시 212를 고려하면 그의 두 번째 수와 세 번째 수를 교환하면 221을 해결할 수 있다.전체 정렬이 생성됩니다.
이렇게 해서 우리도 전체 배열에서 중복을 없애는 규칙을 얻었다. 중복을 없애는 전체 배열은 첫 번째 숫자부터 각각 그 뒤에 반복되지 않는 숫자와 교환하는 것이다.프로그래밍으로 설명하자면 i개수와 j개수를 교환할 때 [i, j)에는 j개수와 같은 수가 없습니다. 다음은 전체 코드를 보여 줍니다.
class mySolution02{
public:

    bool isduplicate(string& s, int start, int end){
        for(int i = start ; i permute(string s){
        sort(s.begin(), s.end());
        vector result;
        helper(result, s, 0);
        return result;
    }

    void helper(vector& result, string& s, int index){
        if(index == s.size()-1)
            result.push_back(s);
        for(int i = index; i

좋은 웹페이지 즐겨찾기