summaryrefslogtreecommitdiff
path: root/extension/src/util/lcs.ts
diff options
context:
space:
mode:
authorTy Dunn <ty@tydunn.com>2023-06-16 15:56:01 -0700
committerGitHub <noreply@github.com>2023-06-16 15:56:01 -0700
commitd9e576d0f81a22a0c6e7f0659e67f3fa38a0d1aa (patch)
tree7d798f83ae62f4d28dfb5c2256b01d52e9a5c2d3 /extension/src/util/lcs.ts
parentc980e01d2f9328d5c37df14bea02f84a4890bc6a (diff)
parent3aa4f014608c09b8da2f4ab95137a959487af245 (diff)
downloadsncontinue-d9e576d0f81a22a0c6e7f0659e67f3fa38a0d1aa.tar.gz
sncontinue-d9e576d0f81a22a0c6e7f0659e67f3fa38a0d1aa.tar.bz2
sncontinue-d9e576d0f81a22a0c6e7f0659e67f3fa38a0d1aa.zip
Merge branch 'main' into too-large
Diffstat (limited to 'extension/src/util/lcs.ts')
-rw-r--r--extension/src/util/lcs.ts30
1 files changed, 30 insertions, 0 deletions
diff --git a/extension/src/util/lcs.ts b/extension/src/util/lcs.ts
new file mode 100644
index 00000000..17ea63f9
--- /dev/null
+++ b/extension/src/util/lcs.ts
@@ -0,0 +1,30 @@
+export function longestCommonSubsequence(a: string, b: string) {
+ const lengths: number[][] = [];
+ for (let i = 0; i <= a.length; i++) {
+ lengths[i] = [];
+ for (let j = 0; j <= b.length; j++) {
+ if (i === 0 || j === 0) {
+ lengths[i][j] = 0;
+ } else if (a[i - 1] === b[j - 1]) {
+ lengths[i][j] = lengths[i - 1][j - 1] + 1;
+ } else {
+ lengths[i][j] = Math.max(lengths[i - 1][j], lengths[i][j - 1]);
+ }
+ }
+ }
+ let result = "";
+ let x = a.length;
+ let y = b.length;
+ while (x !== 0 && y !== 0) {
+ if (lengths[x][y] === lengths[x - 1][y]) {
+ x--;
+ } else if (lengths[x][y] === lengths[x][y - 1]) {
+ y--;
+ } else {
+ result = a[x - 1] + result;
+ x--;
+ y--;
+ }
+ }
+ return result;
+}