<p>Given two strings <code>text1</code> and <code>text2</code>, return <em>the length of their longest <strong>common subsequence</strong>. </em>If there is no <strong>common subsequence</strong>, return <code>0</code>.</p>

<p>A <strong>subsequence</strong> of a string is a new string generated from the original string with some characters (can be none) deleted without changing the relative order of the remaining characters.</p>

<ul>
	<li>For example, <code>&quot;ace&quot;</code> is a subsequence of <code>&quot;abcde&quot;</code>.</li>
</ul>

<p>A <strong>common subsequence</strong> of two strings is a subsequence that is common to both strings.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> text1 = &quot;abcde&quot;, text2 = &quot;ace&quot; 
<strong>Output:</strong> 3  
<strong>Explanation:</strong> The longest common subsequence is &quot;ace&quot; and its length is 3.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> text1 = &quot;abc&quot;, text2 = &quot;abc&quot;
<strong>Output:</strong> 3
<strong>Explanation:</strong> The longest common subsequence is &quot;abc&quot; and its length is 3.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> text1 = &quot;abc&quot;, text2 = &quot;def&quot;
<strong>Output:</strong> 0
<strong>Explanation:</strong> There is no such common subsequence, so the result is 0.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= text1.length, text2.length &lt;= 1000</code></li>
	<li><code>text1</code> and <code>text2</code> consist of only lowercase English characters.</li>
</ul>

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        
        int m=text1.size();
        int n=text2.size();
        int maxi=0;
        unordered_map<int , int > map;
        for(int i=m-1 ; i>=0 ; i--)
        {
            //int max=0;
            int k;
            int j=0;
            while(j<n)
            {
               if(text2[j]==text1[i])
               {
               // max++;
                k=j;
                map[j]=1;
                break;
               }
               j++;
            }
            j++;

            while(j< n)
            {
                
               map[k] = (map[j]+1) > map[k] ? map[j]+1 : map[k];
               
               if(text2[j]==text1[i])
                {
                   k=j;
                   map[k]=1;
                  
                }
                j++;
            }
        }
        int debug=0;
        for(int i=0;i<n ;i++)
        {
         maxi = map[i] > maxi ? map[i] : maxi ;
         if(map[i]+1 > maxi)
           debug=i;
        cout << map[i];
        cout << " "   ;
         
        }
        //cout<< map[n-1];
        return maxi;
    }
};
9019