สมมติว่าเรามีสตริงที่มีคำไม่กี่คำ เราต้องกลับตำแหน่งของคำในสตริง ดังนั้นหากเชือกเป็นเหมือน “จิ้งจอกสีน้ำตาลฉูดฉาดกระโดดทับหมาขี้เกียจ”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน 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"