다른 단어가 포함된 문자열이 있고 그 문자열을 문장이라고 하며 다음 형식으로 되어 있다고 가정합니다. -
-
첫 글자는 대문자입니다.
-
텍스트의 각 단어는 단일 공백 문자로 구분됩니다.
모든 단어가 길이가 오름차순으로 재배열되도록 텍스트의 단어를 재배열해야 합니다. 두 단어의 길이가 같으면 원래 순서대로 정렬합니다.
그런 다음 이 규칙을 적용하여 마지막으로 문자열을 반환합니다.
따라서 입력이 "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