Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 대소문자 순열

<시간/>

문자와 숫자가 포함된 문자열이 있다고 가정합니다. 문자열에 있는 대문자 및 소문자 버전을 사용하여 해당 문자열의 가능한 모든 조합을 생성해야 합니다. 따라서 한 문자열에 숫자만 있는 경우 해당 문자열만 반환됩니다. 문자열이 "1ab2"와 같다고 가정하면 문자열은 ["1ab2", "1Ab2", "1aB2", "1AB2"]

가 됩니다.

이 문제를 해결하기 위해 재귀 접근 방식을 사용합니다. 해당 인덱스에서 작업을 시작하려면 인덱스 매개변수가 필요합니다. 또한 결과가 생성되는 임시 문자열도 필요합니다. 인덱스가 문자열 길이와 같으면 임시 문자열을 반환합니다. 주어진 인덱스에 대해 소문자이면 대문자로, 그 반대로 하고 재귀적으로 작업을 수행합니다.

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<string> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector <string> res;
   void solve(string s, int idx = 0, string temp = ""){
      if(idx == s.size()){
         res.push_back(temp);
         return;
      }
      solve(s, idx + 1, temp + s[idx]);
      int diff = 'a' - 'A';
      if(s[idx] >= 'a' && s[idx] <= 'z'){
         char x = (s[idx] - diff);
         solve(s, idx + 1, temp + x);
      }
      else if (s[idx] >= 'A' && s[idx] <= 'Z'){
         char x = (s[idx] + diff);
         solve(s, idx + 1, temp + x);
      }
   }
   vector<string> letterCasePermutation(string S) {
      res.clear();
      solve(S);
      return res;
   }
};
main(){
   Solution ob;
   print_vector(ob.letterCasePermutation("1ab2"));
   print_vector(ob.letterCasePermutation("9876"));
}

입력

"1ab2"
"9876"

출력

[1ab2, 1aB2, 1Ab2, 1AB2, ]
[9876, ]