32 Evaluate Reverse Polish Notation
public int evalRPN(String[] tokens) {
// digitStack - if symbol.. pop to digits.. operate .. push in stack
String symbols = "+-*/";
Stack<String> digitStack = new Stack<>();
for(String s: tokens) {
// if digits
if() {
[Link](s);
}
else {
// operator.. so operate
int num1 = [Link]([Link]());
int num2 = [Link]([Link]());
if([Link]("+")) {
[Link]([Link](num1+num2));
}
if([Link]("-")) {
[Link]([Link](num2-num1));
}
if([Link]("*")) {
[Link]([Link](num1*num2));
}
if([Link]("/")) {
[Link]([Link](num2/num1));
}
}
}
return [Link]([Link]());
}
37_38 Largest Rectangle in Histogram/2D array
public int maximalRectangle(char[][] matrix) {
if(matrix == null || [Link] == 0 || matrix[0].length == 0)
return -1;
int rows = [Link];
int cols = matrix[0].length;
int[][] dp = new int[rows][cols+1];
for(int r = 0 ; r < rows; r++) {
for(int c = 0; c < cols; c++) {
if(matrix[r][c] == '0') {
dp[r][c] = 0;
}
else {
// first row 1.. else add 1 to prev
dp[r][c] = (r == 0) ? 1 : dp[r-1][c] + 1;
}
}
}
int resultArea = 0;
int currMaxHistogramArea = 0;
for(int[] eachRow: dp) {
currMaxHistogramArea = getMaxAreaInHistogram(eachRow);
resultArea = [Link](resultArea, currMaxHistogramArea);
}
return resultArea;
}
public int getMaxAreaInHistogram(int[] eachRow) {
int result = 0;
int n = [Link];
Stack<Integer> hs = new Stack<Integer>();
[Link](-1);
for(int i = 0; i < [Link]; ++i) {
while([Link]() != -1 && eachRow[[Link]()] >= eachRow[i] )
result = [Link](result, eachRow[[Link]()] * (i -
[Link]() - 1));
[Link](i);
}
while([Link]() != -1) {
result = [Link](result, eachRow[[Link]()] * (n - [Link]() -
1));
}
return result;
}
}
33 Valid Parentheses
public boolean isValid(String s) {
Map<Character, Character> hm = new HashMap<>();
[Link]('(',')'); [Link]('{','}'); [Link]('[',']');
Stack<Character> st = new Stack<>();
for(Character c: [Link]()){
if([Link]().contains(c)) {
[Link](c);
}
else { // closing brace
if([Link]().contains(c)) { // if brace in values
if([Link]() || [Link]([Link]()) != c)
return false;
}
else {
return false;
}
}
}
return [Link]();
}
34 Longest Valid Parentheses (Two Pointers)
public int longestValidParentheses(String s) {
// Scan Left -> Right.. Count openBraces/ closedBraces..
// openBraces == closedBraces .. res = max(res, openBraces+closedBraces)
int openBraces = 0; int closedBraces = 0; int result = 0;
for(int i = 0; i < [Link](); i++) { // Scan Left -> Right
if([Link](i) == '(') openBraces++;
else closedBraces++;
if(openBraces == closedBraces)
result = [Link](result, openBraces + closedBraces);
else if(closedBraces >= openBraces) // *****IMP
openBraces = closedBraces = 0;
}
// Scan Right-> Left.. Count openBraces/ closedBraces..
// openBraces == closedBraces .. res = max(res, openBraces+closedBraces)
openBraces = 0; closedBraces = 0;
for(int i = [Link]()-1; i >=0; i--) { // Scan Left -> Right
if([Link](i) == '(') openBraces++;
else closedBraces++;
if(openBraces == closedBraces)
result = [Link](result, openBraces + closedBraces);
else if(openBraces >= closedBraces ) // *****IMPORTANT
openBraces = closedBraces = 0;
}
return result;
35 Valid Palindrome (Two Pointers)
public boolean isPalindrome_removingSpacesDigitsNumbers(String s) {
int left = 0; int right = [Link]()-1;
while(left < right) {
while(left < right && ))
left++;
while(left < right && ))
right--;
if([Link](left) != [Link](right)) // [Link]
return false;
left++; right--;
}
return true;
}
public boolean isPalindrome_removingOneCharacter(String s) {
// traverse from both ends..
// if diff && !foundDiff then foundDiff = true and remaining isPalindrome
int left = 0;
int right = [Link]() -1;
boolean foundDiff = false;
while(left< right) {
if([Link](left) != [Link](right)) {
if(!foundDiff) {
foundDiff = true;
if(isPalindrome(s, left+1, right))
left++;
else if( isPalindrome(s, left, right-1))
right--;
else
return false;
}
else {
return false;
}
}
else {
left++; right--;
}
}
return true;
}
private boolean isPalindrome(String s, int left, int right) {
while(left<right){
if([Link](left) != [Link](right))
return false;
left++; right--;
}
return true;
}