สมมติว่าเรามีสตริงที่มีตัวเลขตั้งแต่ '0' ถึง '9' เท่านั้น เราต้องเขียนฟังก์ชันเพื่อระบุว่าเป็นตัวเลขบวกหรือไม่ หมายเลขการบวกเป็นสตริงที่มีตัวเลขสามารถสร้างลำดับการบวกได้ ลำดับการเติมที่ถูกต้องควรมีตัวเลขอย่างน้อยสามตัว ในที่นี้ ยกเว้นตัวเลขสองตัวแรก แต่ละหมายเลขในลำดับต่อมาจะต้องเป็นผลรวมของสองตัวก่อนหน้า ดังนั้นหากอินพุตเป็น “112358” คำตอบจะเป็นจริง เช่น 2 =1 + 1, 3 =1 + 2, 5 =2 + 3, 8 =3 + 5.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการที่เรียกว่า ok() ซึ่งจะใช้เวลา s, index, prev1, prev2
-
ถ้า index>=size ของ s แล้วคืนค่า true
-
req :=prev1 + prev2 และ num :=req เป็นสตริง
-
x :=หนึ่งสตริงว่าง
-
สำหรับฉันอยู่ในช่วงดัชนีถึงขนาดของ s
-
x :=x + s[i]
-
ถ้า x =num และ ok(s, i + 1, prev2, x เป็นจำนวนเต็ม) แล้วคืนค่า จริง
-
-
คืนค่าเท็จ
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
n :=ขนาดของ num
-
สำหรับผมอยู่ในช่วง 1 ถึง n – 2
-
สำหรับ j ในช่วง 1 ถึง i
-
s1 :=สตริงย่อยของ num จาก 0 ถึง j – 1
-
s2 :=สตริงย่อยของ num จาก j ถึง i – j
-
x :=สูงสุดของขนาด s1 และ s2
-
ถ้า x> n – i ให้ทำซ้ำต่อไป
-
ถ้า (s1[0] เป็น 0 และขนาดของ s1> 0) หรือ (s2[0] เป็น 0 และขนาดของ s2> 1) ให้ข้ามไปที่การวนซ้ำถัดไป
-
ถ้า ok(num, i + 1, s1 เป็นจำนวนเต็ม และ s2 เป็นจำนวนเต็ม) เป็นจริง ให้คืนค่า true
-
-
-
คืนค่าเท็จ
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: bool ok(string s, int idx, lli prev1, lli prev2){ if(idx >= s.size()) return true; lli req = prev1 + prev2; string num = to_string(req); string x = ""; for(int i = idx; i < s.size(); i++){ x += s[i]; if(x == num && ok(s, i + 1, prev2, stol(x))) return true; } return false; } bool isAdditiveNumber(string num) { int n = num.size(); for(int i = 1; i < n - 1; i++){ for(int j = 1; j <= i; j++){ string s1 = num.substr(0, j); string s2 = num.substr(j, i - j + 1); int x = max((int)s1.size(), (int)s2.size()); if(x > n - i) continue; if((s1[0] == '0' && s1.size() > 1) || (s2[0] == '0' && s2.size() > 1)) continue; if(ok(num, i + 1, stol(s1), stol(s2))) return true; } } return false; } }; main(){ Solution ob; cout << (ob.isAdditiveNumber("112358")); }
อินพุต
"112358"
ผลลัพธ์
1