Difficulty: 🟡 Medium
You have a browser of one tab where you start on the homepage
and you can visit another url
, get back in the history number of steps
or move forward in the history number of steps
.
Implement the BrowserHistory
class:
BrowserHistory(string homepage)
Initializes the object with thehomepage
of the browser.void visit(string url)
Visitsurl
from the current page. It clears up all the forward history.string back(int steps)
Movesteps
back in history. If you can only returnx
steps in the history andsteps > x
, you will return onlyx
steps. Return the currenturl
after moving back in history at moststeps
.string forward(int steps)
Movesteps
forward in history. If you can only forwardx
steps in the history andsteps > x
, you will forward onlyx
steps. Return the currenturl
after forwarding in history at moststeps
.
Input:
["BrowserHistory","visit","visit","visit","back","back","forward","visit","forward","back","back"]
[["leetcode.com"],["google.com"],["facebook.com"],["youtube.com"],[1],[1],[1],["linkedin.com"],[2],[2],[7]]
Output:
[null,null,null,null,"facebook.com","google.com","facebook.com",null,"linkedin.com","google.com","leetcode.com"]
Explanation:
BrowserHistory browserHistory = new BrowserHistory("leetcode.com");
browserHistory.visit("google.com"); // You are in "leetcode.com". Visit "google.com"
browserHistory.visit("facebook.com"); // You are in "google.com". Visit "facebook.com"
browserHistory.visit("youtube.com"); // You are in "facebook.com". Visit "youtube.com"
browserHistory.back(1); // You are in "youtube.com", move back to "facebook.com" return "facebook.com"
browserHistory.back(1); // You are in "facebook.com", move back to "google.com" return "google.com"
browserHistory.forward(1); // You are in "google.com", move forward to "facebook.com" return "facebook.com"
browserHistory.visit("linkedin.com"); // You are in "facebook.com". Visit "linkedin.com"
browserHistory.forward(2); // You are in "linkedin.com", you cannot move forward any steps.
browserHistory.back(2); // You are in "linkedin.com", move back two steps to "facebook.com" then to "google.com". return "google.com"
browserHistory.back(7); // You are in "google.com", you can move back only one step to "leetcode.com". return "leetcode.com"
1 <= homepage.length <= 20
1 <= url.length <= 20
1 <= steps <= 100
homepage
andurl
consist of '.' or lower case English letters.- At most
5000
calls will be made tovisit
,back
, andforward
class VisitedPage:
def __init__(self, url: str):
self.next = None
self.prev = None
self.url = url
class BrowserHistory:
def __init__(self, homepage: str):
self._current = VisitedPage(homepage)
def visit(self, url: str) -> None:
temp = VisitedPage(url)
temp.prev = self._current
self._current.next = temp
self._current = temp
def back(self, steps: int) -> str:
while steps and self._current.prev:
self._current = self._current.prev
steps -= 1
return self._current.url
def forward(self, steps: int) -> str:
while steps and self._current.next:
self._current =self._current.next
steps -= 1
return self._current.url
# Your BrowserHistory object will be instantiated and called as such:
# obj = BrowserHistory(homepage)
# obj.visit(url)
# param_2 = obj.back(steps)
# param_3 = obj.forward(steps)
The given solution implements the BrowserHistory
class using a linked list data structure. Each node in the linked list represents a visited page, and it contains the URL as well as references to the next and previous nodes.
Here is a step-by-step overview of the solution:
- Define a helper class
VisitedPage
that represents a visited page in the browser's history. It has attributesnext
,prev
, andurl
to store the references to the next and previous pages, as well as the URL of the current page. - In the
BrowserHistory
class, initialize the_current
attribute with theVisitedPage
object representing the homepage. - Implement the
visit
method:- Create a new
VisitedPage
object with the given URL. - Set the
prev
reference of the new page to the current page. - Set the
next
reference of the current page to the new page. - Update the
_current
attribute to the new page.
- Create a new
- Implement the
back
method:- Iterate
steps
times:- If the current page has a previous page, update the
_current
attribute to the previous page.
- If the current page has a previous page, update the
- Return the URL of the current page.
- Iterate
- Implement the
forward
method:- Iterate
steps
times:- If the current page has a next page, update the
_current
attribute to the next page.
- If the current page has a next page, update the
- Return the URL of the current page.
- Iterate
The time complexity for the visit
, back
, and forward
methods is O(steps) since we iterate steps
times to move back or forward in the history.
The space complexity is O(1) since we use a constant amount of additional space.
The given solution implements the BrowserHistory
class using a linked list. It allows us to visit URLs, go back or forward in the history, and returns the current URL. The time complexity of the methods is O(steps), and the space complexity is O(1).
NB: If you want to get community points please suggest solutions in other languages as merge requests.