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

C++에서 문장의 단어 재정렬

<시간/>

다른 단어가 포함된 문자열이 있고 그 문자열을 문장이라고 하며 다음 형식으로 되어 있다고 가정합니다. -

  • 첫 글자는 대문자입니다.

  • 텍스트의 각 단어는 단일 공백 ​​문자로 구분됩니다.

모든 단어가 길이가 오름차순으로 재배열되도록 텍스트의 단어를 재배열해야 합니다. 두 단어의 길이가 같으면 원래 순서대로 정렬합니다.

그런 다음 이 규칙을 적용하여 마지막으로 문자열을 반환합니다.

따라서 입력이 "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