15. String Stack
β GFG solution to the String Stack problem: determine if target string can be constructed from pattern using append/delete operations with optimal two-pointer approach. π
The problem can be found at the following link: π Question Link
π§© Problem Description
You are given two strings pat and tar consisting of lowercase English characters. You can construct a new string s by performing any one of the following operations for each character in pat:
Append the character
pat[i]to the strings.Delete the last character of
s(ifsis empty do nothing).
After performing operations on every character of pat exactly once, your goal is to determine if it is possible to make the string s equal to string tar.
π Examples
Example 1
Input: pat = "geuaek", tar = "geek"
Output: true
Explanation: Append the first three characters of pat to s, resulting in s = "geu".
Delete the last character for 'a', leaving s = "ge". Then, append the last two
characters 'e' and 'k' from pat to s, resulting in s = "geek", which matches tar.Example 2
Input: pat = "agiffghd", tar = "gfg"
Output: true
Explanation: Skip the first character 'a' in pat. Append 'g' and 'i' to s,
resulting in s = "gi". Delete the last character for 'f', leaving s = "g".
Append 'f', 'g', and 'h' to s, resulting in s = "gfgh". Finally, delete the
last character for 'd', leaving s = "gfg", which matches tar.Example 3
π Constraints
$1 \le \text{pat.size()}, \text{tar.size()} \le 10^5$
β
My Approach
The optimal approach uses a Reverse Two-Pointer technique with Greedy Strategy:
Reverse Two-Pointer + Greedy
Initialize Pointers:
Start from the end of both strings:
i = pat.length() - 1andj = tar.length() - 1.Process characters from right to left (reverse order).
Key Insight:
When we process
patfrom left to right, we either append or delete.Processing from right to left simulates the final state of our constructed string.
If
pat[i] == tar[j], this character was appended to match the target.If
pat[i] != tar[j], this character was used for deletion (removing previous character).
Algorithm Logic:
Match Found (
pat[i] == tar[j]):This character contributes to the target string.
Move both pointers backward:
i--,j--.
No Match (
pat[i] != tar[j]):This character was used for deletion operation.
It deleted the previous character, so skip 2 positions:
i -= 2.Keep
junchanged as no progress made toward target.
Termination:
Continue until either pointer goes out of bounds.
Return
trueif all target characters are matched (j < 0).
Why This Works:
Greedy approach: prioritize matching characters when possible.
Reverse processing naturally handles the stack-like append/delete operations.
Each character in
patis used exactly once (either for append or delete).
π Time and Auxiliary Space Complexity
Expected Time Complexity: O(n + m), where n is the length of
patand m is the length oftar. In the worst case, we traverse both strings once.Expected Auxiliary Space Complexity: O(1), as we only use a constant amount of additional space for the two pointers and no extra data structures.
π§βπ» Code (C++)
β Code (Java)
π Code (Python)
π§ Contribution and Support
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: π¬ Any Questions?. Let's make this learning journey more collaborative!
β If you find this helpful, please give this repository a star! β
πVisitor Count
Last updated