Given two strings `text1` and `text2`, return the length of their longest common subsequenceIf there is no common subsequence, return `0`.

subsequence 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.

• For example, `"ace"` is a subsequence of `"abcde"`.

common subsequence of two strings is a subsequence that is common to both strings.

Example 1:

```Input: text1 = "abcde", text2 = "ace"
Output: 3
Explanation: The longest common subsequence is "ace" and its length is 3.
```

Example 2:

```Input: text1 = "abc", text2 = "abc"
Output: 3
Explanation: The longest common subsequence is "abc" and its length is 3.
```

Example 3:

```Input: text1 = "abc", text2 = "def"
Output: 0
Explanation: There is no such common subsequence, so the result is 0.
```

Constraints:

• `1 <= text1.length, text2.length <= 1000`
• `text1` and `text2` consist of only lowercase English characters.

Idea:

Dynamic Programing

``````Use dp[i][j] to represent the length of longest common sub-sequence of text1[0:i-1] and text2[0:j-1]
dp[i][j] = dp[i – 1][j – 1] + 1 if text1[i – 1] == text2[j – 1] else max(dp[i][j – 1], dp[i – 1][j])``````

Solution:

``````/**
* @param {string} text1
* @param {string} text2
* @return {number}
*/
var longestCommonSubsequence = function(text1, text2) {
// Use dp[i][j] to represent the length of longest common sub-sequence of text1[0:i-1] and text2[0:j-1]
// dp[i][j] = dp[i – 1][j – 1] + 1 if text1[i – 1] == text2[j – 1] else max(dp[i][j – 1], dp[i – 1][j])
let dp = Array.from(new Array(text1.length + 1), () => new Array(text2.length + 1));

// final result dp[i + 1][j + 1] contains length of LCS
// for text1[0..i] and text2[0..j], so use <=
for (let i = 0; i <= text1.length; i++) {
for (let j = 0; j <= text2.length; j++) {
// base case:
if (i === 0 || j === 0)
dp[i][j] = 0;
else if (text1[i - 1] === text2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
// dp[text1.length][text2.length] contains length of LCS
// for text1[0..text1.length-1] and text2[0..text2.length-1]
return dp[text1.length][text2.length];
}``````