다른 단어가 포함된 문자열이 있고 그 문자열을 문장이라고 하며 다음 형식으로 되어 있다고 가정합니다. -
-
첫 글자는 대문자입니다.
-
텍스트의 각 단어는 단일 공백 문자로 구분됩니다.
모든 단어가 길이가 오름차순으로 재배열되도록 텍스트의 단어를 재배열해야 합니다. 두 단어의 길이가 같으면 원래 순서대로 정렬합니다.
그런 다음 이 규칙을 적용하여 마지막으로 문자열을 반환합니다.
따라서 입력이 "I love to code in cpp"와 같으면 출력은 "I to in cpp love code"가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
텍스트의 첫 글자를 소문자로 만들기
-
배열 정의 x :=공백을 사용하여 텍스트를 분할한 후 모든 단어 넣기
-
쌍의 배열 정의
-
initialize i :=0의 경우, i
-
s
끝에 {x[i],i} 삽입
-
-
길이가 동일한 경우 인덱스 값을 사용하여 길이를 기준으로 배열 s를 정렬합니다.
-
ret :=빈 문자열
-
initialize i :=0의 경우, i
-
ret :=ret s[i]의 첫 번째 요소 연결
-
i가 s의 크기와 같지 않으면 -
-
ret :=ret 공백으로 연결
-
-
-
ret의 첫 번째 문자를 대문자로 만들기
-
리턴 렛
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector <string> split(string& s, char delimiter){
vector <string> tokens;
string token;
istringstream tokenStream(s);
while(getline(tokenStream, token, delimiter)){
tokens.push_back(token);
}
return tokens;
}
static bool cmp(pair <string, int>& a, pair <string, int>& b){
if(a.first.size() != b.first.size()) return a.first.size() < b.first.size();
return a.second < b.second;
}
static bool a(string& a, string& b){
return a.size() < b.size();
}
string arrangeWords(string text) {
text[0] += 'a' - 'A';
vector<string> x = split(text, ' ');
vector<pair<string, int> > s;
for (int i = 0; i < x.size(); i++)
s.push_back({ x[i], i });
sort(s.begin(), s.end(), cmp);
string ret = "";
for (int i = 0; i < s.size(); i++) {
ret += s[i].first;
if (i != s.size() - 1)
ret += ' ';
}
ret[0] += 'A' - 'a';
return ret;
}
};
main(){
Solution ob;
cout << (ob.arrangeWords("I love to code in cpp"));
} 입력
"I love to code in cpp"
출력
I to in cpp love code