สมมติว่าเรามีสตริงที่มีคำไม่กี่คำ เราต้องกลับตำแหน่งของคำในสตริง ดังนั้นหากเชือกเป็นเหมือน “จิ้งจอกสีน้ำตาลฉูดฉาดกระโดดทับหมาขี้เกียจ”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน getString() ซึ่งจะใช้ s เป็นอินพุต ซึ่งจะทำงานเป็น −
-
ผม :=0, j :=ขนาดของ s – 1
-
ในขณะที่ s[i] =‘ ’ และ i <ขนาดของ s ให้เพิ่ม i ขึ้น 1
-
ในขณะที่ j>=0 และ s[j] =‘ ’, ลด j โดย 1
-
ret :=สตริงว่าง
-
สำหรับ i <=j เพิ่ม i ขึ้น 1
-
หากขนาดของ ret ไม่ใช่ศูนย์และองค์ประกอบสุดท้ายของ ret คือ ' ' และ s[i] คือ ' ' ให้ทำซ้ำต่อไป
-
ret :=ret + s[i]
-
-
กำหนดวิธีการอื่นที่เรียกว่า reverseWords() ซึ่งจะใช้ s เป็นอินพุต
-
เจ :=0
-
สำหรับผม ในช่วง 0 ถึงขนาด s – 1 ในแต่ละขั้นตอนตั้งค่า i :=j
-
ถ้า s[i] ว่างเปล่า j :=i + 1
-
อย่างอื่น
-
ในขณะที่ j + 1 <ขนาดของ s และ s[j + 1] ไม่ใช่ช่องว่าง ให้เพิ่ม j ขึ้น 1
-
x :=ผม และ y :=j
-
ในขณะที่ x
-
แลกเปลี่ยน s[x] และ s[y] เพิ่ม x ขึ้น 1 และดับ y ทีละ 1
-
-
เพิ่มขึ้น 1
-
-
-
จากวิธีหลัก ให้ทำดังนี้ −
-
ย้อนกลับสตริง s
-
ย้อนกลับคำ
-
ส่งคืน getString
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: string reverseWords(string s) { reverse(s.begin(), s.end()); reverseWordss(s); return getString(s); } string getString(string s){ int i = 0; int j = s.size() - 1; while(s[i] == ' ' && i < s.size()) i++; while(j >= 0 && s[j] == ' ') j--; string ret = ""; for(;i <= j; i++){ if(ret.size() && ret.back() == ' ' && s[i] == ' ')continue; ret += s[i]; } return ret; } void reverseWordss(string& s){ int j = 0; for(int i = 0; i < s.size() ;i = j){ if(s[i] == ' '){ j = i + 1; } else{ while(j + 1 < s.size() && s[j + 1] != ' ') j++; int x = i; int y = j; while(x < y){ swap(s[x], s[y]); x++; y--; } j++; } } } }; main(){ Solution ob; cout << (ob.reverseWords("The quick brown fox jumps over a lazy dog")); }
อินพุต
"The quick brown fox jumps over a lazy dog"
ผลลัพธ์
"dog lazy a over jumps fox brown quick The"