Advertisement
imashutosh51

Valid parenthesis in O(n) space and O(1) space

Aug 8th, 2022
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. /*
  2. Time complexity O(n), Space complexity O(1)
  3. */
  4. // bool valid(string s)
  5. // {  
  6. //     map<char,char> mp;
  7. //     mp['(']=')';
  8. //     mp['{']='}';
  9. //     mp['[']=']';
  10. //     stack<char> st;
  11. //     for(auto itr:s){
  12. //         if(itr=='(' || itr=='[' || itr=='{') st.push(itr);
  13. //         else{
  14. //             if(st.empty()){return false; }
  15. //             char temp=st.top();
  16. //             st.pop();
  17. //             if(mp[temp]!=itr) return false;
  18. //         }
  19. //     }
  20. //     if(st.empty()) return true;
  21. //     return false;
  22. // }
  23.  
  24. /*
  25. TC. O(n^3) S.C=O(1)
  26. Let's assume there is an opening bracket at ith index,and closing bracket for that bracket is at j so between i to j exclusive,
  27. every starting index must have their closing bracket in i to j exclusive.
  28. */
  29.  
  30. int findclose(string str, int start,
  31.                 int end, char open, char close)
  32. {
  33.     int c = 1;
  34.     int i = start + 1;
  35.     while (i <= end) {
  36.         if (str[i] == open)
  37.             c++;
  38.         else if (str[i] == close)
  39.             c--;
  40.         if (c == 0)
  41.             return i;
  42.         i++;
  43.     }
  44.     return i;
  45. }
  46.  
  47. // Function1 to match opening bracket
  48. int findopen(string str, int start,
  49.                     int end, char open, char close)
  50. {
  51.     int c = -1;
  52.     int i = end - 1;
  53.  
  54.     while (i >= start) {
  55.         if (str[i] == open)
  56.             c++;
  57.         else if (str[i] == close)
  58.             c--;
  59.         if (c == 0)
  60.             return i;
  61.         i--;
  62.     }
  63.     return -1;
  64. }
  65. bool valid(string s){
  66.     int i, j, k, x, start, end,n=s.size();
  67.  
  68.     for (i = 0; i < n; i++) {  //handling case of opening parenthesis
  69.         if (s[i] == '(')
  70.             j = findclose(s, i, n - 1, '(', ')');
  71.         else if (s[i] == '{')
  72.             j = findclose(s, i, n - 1, '{', '}');
  73.         else if (s[i] == '[')
  74.             j = findclose(s, i, n - 1, '[', ']');
  75.  
  76.         else {   // Handling case of closing parentheses                                  
  77.             if (s[i] == ')')
  78.                 j = findopen(s, 0, i, '(', ')');
  79.             else if (s[i] == '}')
  80.                 j = findopen(s, 0, i, '{', '}');
  81.             else if (s[i] == ']')
  82.                 j = findopen(s, 0, i, '[', ']');
  83.  
  84.             if (j < 0)  //for closing bracket,opening bracket must exist
  85.                 return false;
  86.  
  87.             continue;  //no need to check interval for closing bracket,it would have been already checked
  88.                        //when opening bracket would have appeared for current closing bracket.
  89.         }
  90.         if (j >= n)  //for opening bracket,closing bracket must exist
  91.             return false;
  92.  
  93.         int l = i,r = j;
  94.         for (k = l + 1; k < r; k++) {  // if found, now check for each opening and closing parentheses in this interval
  95.             if (s[k] == '(') {
  96.                 x = findclose(s, k, r, '(', ')');  //find closing bracket for opening bracket
  97.                 if (!(x < r)) {   //closing bracket must be before
  98.                     return false;
  99.                 }
  100.             }
  101.             else if (s[k] == ')') {
  102.                 x = findopen(s, l, k, '(', ')');  //find opening bracket for closing bracket
  103.                 if (!(l < x)) {    //opening bracket must be after start
  104.                     return false;
  105.                 }
  106.             }
  107.  
  108.             if (s[k] == '{') {
  109.                 x = findclose(s, k, r, '{', '}');
  110.                 if (!(x < r)) {
  111.                     return false;
  112.                 }
  113.             }
  114.  
  115.             else if (s[k] == '}') {
  116.                 x = findopen(s, l, k, '{', '}');
  117.                 if (!(l < x)) {
  118.                     return false;
  119.                 }
  120.             }
  121.             if (s[k] == '[') {
  122.                 x = findclose(s, k, r, '[', ']');
  123.                 if (!(x < r)) {
  124.                     return false;
  125.                 }
  126.             }
  127.             else if (s[k] == ']') {
  128.                 x = findopen(s, l, k, '[', ']');
  129.                 if (!(l < x)) {
  130.                     return false;
  131.                 }
  132.             }
  133.         }
  134.     }
  135.     return true;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement