ได้รับโปรแกรม C++ เป็นอินพุต ลบคอมเมนต์ออกจากมัน 'source' เป็นเวกเตอร์ที่บรรทัดที่ i ของซอร์สโค้ดคือ source[i] นี่แสดงถึงผลลัพธ์ของการแบ่งสตริงซอร์สโค้ดด้วยอักขระ newline \n ใน C++ เราสามารถสร้างคอมเมนต์สองประเภทได้คือ Line Comments และ Block Comments
สตริง '\\' หมายถึง line comment ซึ่งหมายถึงสตริงข้างขวาของมันจะถูกละเว้นโดยโปรแกรม
สตริง '/* และ */' เป็น multi-line comment แสดงถึงสตริงเริ่มต้นจาก '/* จนถึง '*/' จะถูกละเว้น
คอมเมนต์ที่มีประโยชน์ตัวแรกมีความสำคัญมากกว่าคอมเมนต์อื่นๆ: หากสตริง // เกิดขึ้นใน block comment จะถูกละเว้นเช่นกัน หากสตริง /* เกิดขึ้นใน line หรือ block comment ก็จะถูกละเว้นเช่นกัน หากบรรทัดโค้ดใดว่างเปล่าหลังจากลบคอมเมนต์ คุณต้องไม่เอาต์พุทบรรทัดนั้น - สตริงแต่ละอันในรายการคำตอบจะไม่ว่างเปล่า
ตัวอย่าง
อินพุต
source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"]
เอาต์พุต
["int main()", "{ ", " ", "int a, b, c;", "a = b + c;", "}"]
วิธีการแก้ปัญหา
- เราจะแยกวิเคราะห์สตริงทีละบรรทัดเหมือนคอมไพเลอร์ที่สมบูรณ์ เราจะละเว้นอักขระทั้งหมดระหว่างและหลัง block quotes เหล่านี้เมื่อเราพบ // หรือ '/* /*'
- ฟังก์ชัน removeString(vector<string>& source) รับซอร์สโค้ดเป็นอินพุตและคืนโค้ดหลังจากลบคอมเมนต์
- ตัวแปร Boolean comment เริ่มต้นเป็น false ซึ่งจะตรวจสอบว่าบล็อกของสตริงหรืออักขระเฉพาะเป็นคอมเมนต์หรือไม่
- หากเราเริ่ม block comment และเราไม่อยู่ในบล็อก เราจะข้ามอักขระถัดไปสองตัวและเปลี่ยนสถานะในบล็อกนั้นๆ
- หากเราจบ block comment และเราอยู่ในบล็อก เราจะข้ามอักขระถัดไปสองตัวและเปลี่ยนสถานะเป็นไม่อยู่ในบล็อก
- หากเราเริ่ม line comment และไม่อยู่ในบล็อก เราจะละเว้นส่วนที่เหลือของบรรทัด
- หากเราไม่อยู่ใน block comment (และไม่ใช่การเริ่มต้นของคอมเมนต์) เราจะบันทึกอักขระที่เราอยู่
- หากเราไม่อยู่ในบล็อกที่ท้ายของแต่ละบรรทัด เราจะบันทึกบรรทัดนั้น
- อัลกอริทึมทำงานในเวลา O(source) source คือสตริงอินพุต
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
vector<string> removeComments(vector<string> &source) {
vector<string> ans;
string s;
bool comment = false;
for (int i = 0; i < source.size(); i++) {
for (int j = 0; j < source[i].size(); j++) {
if (!comment && j + 1 < source[i].size() && source[i][j] == '/' && source[i][j+1] == '/')
break;
else if (!comment && j + 1 < source[i].size() && source[i][j] == '/' && source[i][j+1] == '*') {
comment = true;
j++;
}
else if (comment && j + 1 < source[i].size() && source[i][j] == '*' && source[i][j+1] == '/') {
comment = false;
j++;
}
else if (!comment)
s.push_back(source[i][j]);
}
if (!comment && s.size()) {
ans.push_back(s);
s.clear();
}
}
return ans;
}
int main() {
vector<string> source = {"/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"};
vector<string> res = removeComments(source);
for (auto x : res) {
cout << x;
}
return 0;
}
ผลลัพธ์
["int main()","{ "," ","int a, b, c;","a = b + c;","}"]