给定两个字符串，编写Python代码找到它们的最长公共子序列。


字符串1: "ABCDGH"
字符串2: "AEDFHR"
一个可能的Python实现是：

```python
def longest_common_subsequence(str1, str2):
    m = len(str1)
    n = len(str2)
    lcs = [[0] * (n+1) for _ in range(m+1)]
    for i in range(1, m+1):
        for j in range(1, n+1):
            if str1[i-1] == str2[j-1]:
                lcs[i][j] = lcs[i-1][j-1] + 1
            else:
                lcs[i][j] = max(lcs[i-1][j], lcs[i][j-1])
    return lcs[m][n]
```

这个函数使用动态规划的思想，创建了一个`m+1`行`n+1`列的二维数组`lcs`，其中`lcs[i][j]`表示字符串`str1`中前`i`个字符和字符串`str2`中前`j`个字符的最长公共子序列的长度。初始化时，所有的`lcs[i][0]`和`lcs[0][j]`都为0。然后，使用两个嵌套的循环遍历`str1`和`str2`中的所有字符，并根据它们是否相等来更新`lcs`数组，最后返回`lcs[m][n]`即可。