สมมติว่าเรามีหน้าจอแถว x cols และประโยคที่แสดงโดยรายการคำที่ไม่เว้นว่างไว้ ดังนั้นเราต้องค้นหาว่าประโยคที่กำหนดนั้นสามารถติดตั้งบนหน้าจอได้กี่ครั้ง มีคุณสมบัติบางอย่าง -
-
คำจะไม่ถูกแบ่งออกเป็นสองบรรทัด
-
ต้องไม่เปลี่ยนลำดับของคำในประโยค
-
จะมีช่องว่างเพียงช่องเดียวระหว่างคำสองคำ
-
จำนวนคำทั้งหมดในประโยคจะไม่เกิน 100
-
ความยาวของแต่ละคำมากกว่า 0 แต่น้อยกว่า 10
-
1 ≤ แถว cols ≤ 20,000
ดังนั้นหากอินพุตเป็นเหมือนแถว =3 และ cols =6 และประโยคคือ [“a”, “bcd”, “e”] ผลลัพธ์จะเป็น 2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดแผนที่ dp ตั้งค่า ret :=0, n :=ขนาดของอาร์เรย์ประโยค
-
ในขณะที่แถวไม่ใช่ 0
-
start :=ret mod n, len :=-l and cnt :=0
-
ถ้า start ไม่มีอยู่ใน dp แล้ว
-
ในขณะที่ 1 + len + ขนาดของประโยค[(start + cnt) mod n] <=cols
-
len :=1 + len + ประโยค[(start + cnt) mod n]
-
เพิ่มขึ้นอีก 1
-
-
dp[start] :=cnt
-
ret :=ret + cnt
-
-
มิฉะนั้น ret :=ret + dp[start]
-
แถว :=แถว – 1
-
-
ผลตอบแทนย้อนหลัง/n
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int wordsTyping(vector<string>& sentence, int rows, int cols) {
unordered_map <int, int> dp;
int ret = 0;
int n = sentence.size();
while(rows--){
int start = ret % n;
int len = -1;
int cnt = 0;
if(!dp.count(start)){
while(1 + len + (int)sentence[(start + cnt) % n].size() <= cols){
len = 1 + len + sentence[(start + cnt) % n].size();
cnt++;
}
dp[start] = cnt;
ret += cnt;
}
else{
ret += dp[start];
}
}
return ret / n;
}
};
main(){
vector<string> v = {"a","bcd","e"};
Solution ob;
cout << (ob.wordsTyping(v, 3, 6));
} อินพุต
["a","bcd","e"] 3 6
ผลลัพธ์
2