สมมติว่าเรามีสตริงที่มีคำต่างกัน สตริงนั้นเรียกว่าประโยค และอยู่ในรูปแบบต่อไปนี้ -
-
อักษรตัวแรกเป็นตัวพิมพ์ใหญ่
-
แต่ละคำในข้อความคั่นด้วยอักขระเว้นวรรคหนึ่งตัว
เราต้องจัดเรียงคำในข้อความใหม่เพื่อให้คำทั้งหมดถูกจัดเรียงใหม่โดยเรียงตามความยาวที่เพิ่มขึ้น หากคำสองคำมีความยาวเท่ากัน ให้จัดเรียงตามลำดับเดิม
จากนั้นจึงคืนค่าสตริงโดยใช้กฎเหล่านี้
ดังนั้น หากอินพุตเป็นเหมือน "ฉันชอบเขียนโค้ดใน cpp" ผลลัพธ์จะเป็น "ฉันชอบโค้ดใน cpp"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ทำให้อักขระตัวแรกของข้อความเป็นตัวพิมพ์เล็ก
-
กำหนดอาร์เรย์ x :=ใส่คำทั้งหมดหลังจากแยกข้อความโดยใช้ช่องว่าง
-
กำหนดอาร์เรย์ของคู่
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ใส่ {x[i],i} ต่อท้าย s
-
-
จัดเรียงอาร์เรย์ตามความยาว หากความยาวเท่ากัน ให้ใช้ค่าดัชนี
-
ret :=สตริงว่าง
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ret :=ret เชื่อมองค์ประกอบแรกของ s[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