arr 문자열 배열이 있다고 가정합니다. 문자열 s는 고유한 문자를 가진 arr의 하위 시퀀스를 연결한 것입니다. s의 가능한 최대 길이를 찾으십시오. 입력이 ["cha", "r", "act", "ers"]와 같은 경우 출력은 6이고 가능한 솔루션은 "chaers" 및 "acters"입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- ok()라는 메서드를 하나 만들고 문자열 s와 t를 사용합니다. 다음과 같이 작동합니다.
- 하나의 지도 만들기 x
- 0부터 s
- 까지의 범위에 있는 i의 경우
- x[s[i]] 1씩 증가
- x[s[i]]> 1이면 false를 반환합니다.
- 0에서 t
- 까지의 범위에 있는 i의 경우
- x[t[i]] 1씩 증가
- x[t[i]]> 1이면 false를 반환합니다.
- 참을 반환
- 실제 방법은 아래와 같습니다 -
- v라는 문자열의 배열을 만들고 ans :=0, 하나의 빈 문자열을 v에 삽입
- 0에서 arr 크기까지의 범위에 있는 i의 경우
- n :=v의 크기
- 0 ~ n – 1 범위의 j에 대해
- ok(v[j], arr[i])가 참이면
- t :=v[j] + arr[i]
- v에 t 삽입
- ans :=as의 최대값과 t의 크기
- ok(v[j], arr[i])가 참이면
- 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#include <bits/stdc++.h> using namespace std; class Solution { public: bool ok(string s, string t){ map <char, int > x; for(int i = 0; i < s.size(); i++){ x[s[i]]++; if(x[s[i]] >1)return false; } for(int i = 0; i < t.size(); i++){ x[t[i]]++; if(x[t[i]]>1)return false; } return true; } int maxLength(vector<string>& arr) { vector <string> v; int ans = 0; v.push_back(""); for(int i = 0; i < arr.size(); i++){ int n = v.size(); for(int j = 0; j < n; j++){ if(ok(v[j],arr[i])){ string t = v[j]+arr[i]; v.push_back(t); ans = max(ans,(int)t.size()); } } } return ans; } }; main(){ vector<string> v = {"cha","r","act","ers"}; Solution ob; cout << (ob.maxLength(v)); }
입력
["cha","r","act","ers"]
출력
6