Algorithm learning - Java implements the longest common subsequence
实验目的:
输入两个相同类型的序列,用动态规划方法计算他们的最长公共子序列的长度以及序列。
(推荐教程:java视频教程)
思路:
1、先用一个二维数组存储最长公共子序列的长度,还要记录每个值的状态
2、根据记录值的状态,递归回溯求出最长公共子序列
3、递归方程:
代码实现:
package c最长公共子序列; import java.util.Scanner; /** * @author Draco * @see 最长公共子序列(Longest common subsequence) * @version * @date-time 2020-04-27 - 下午4:23:36 */ public class LCS { public static void main(String[] args) { // 测试字符串:ABCBDAB BDCABA Scanner scanner = new Scanner(System.in); System.out.println("注意:第一个串要长于第二个串"); System.out.print("请输入第一个字符串:"); String string1 = scanner.next(); System.out.print("请输入第二个字符串:"); String string2 = scanner.next(); String str1 = string1; String str2 = string2; // String str1 = "ABCBDAB"; // String str2 = "BDCABA"; int[][] c = getSubstringMatrix(str1, str2); String[][] b = getTrace(str1, str2); System.out.println("长度矩阵:"); show(c); System.out.println(); System.out.println("方向矩阵:"); showForString(b); System.out.println("最长公共子序列的长度:" + c[str1.length()][str2.length()]); String sMax = str1.length() > str2.length() ? str1 : str2; // 选择最长的串,因为要取出最大子串 String sMin = str1.length() < str2.length() ? str1 : str2; // 选择最小的串 System.out.print("最长公共子串:"); print(b, sMax, sMax.length(), sMin.length()); } /** * @see 找出子序列的矩阵,其中最后一行,最后一列就是最长子序列的的长度 * @param x 第一个字符串 * @param y 第二个字符串 * @return 长度矩阵 */ public static int[][] getSubstringMatrix(String x, String y) { int xLen = x.length() + 1; // 加1是因为初始化第一个为0 int yLen = y.length() + 1; int rLen = xLen > yLen ? xLen : yLen; // 大的串置为行 int cLen = xLen < yLen ? xLen : yLen; // 小的串置为列 int[][] c = new int[rLen][cLen]; // 矩阵c保存状态 for (int i = 1; i < rLen; i++) { for (int j = 1; j < cLen; j++) { if (x.charAt(i - 1) == y.charAt(j - 1)) { // 相等,由斜对角线+1 c[i][j] = c[i - 1][j - 1] + 1; } else if (c[i - 1][j] >= c[i][j - 1]) { // 不相等,选取较大的 c[i][j] = c[i - 1][j]; } else { c[i][j] = c[i][j - 1]; } } } return c; // 长度矩阵 } /** * @see 记录每个值的状态,这样方便后面的回溯递归 * @param x 第一个字符串 * @param y 第二个字符串 * @return 方向矩阵 */ public static String[][] getTrace(String x, String y) { int xLen = x.length() + 1; int yLen = y.length() + 1; // 给矩阵c和b设置行和列 int rLen = xLen > yLen ? xLen : yLen;// 大的串置为行 int cLen = xLen < yLen ? xLen : yLen;// 小的串置为列 int[][] c = new int[rLen][cLen]; String[][] b = new String[rLen][cLen]; for (int i = 1; i < rLen; i++) { for (int j = 1; j < cLen; j++) { if (x.charAt(i - 1) == y.charAt(j - 1)) {// 相等 c[i][j] = c[i - 1][j - 1] + 1; b[i][j] = "\\\\";// 指向左上角 } else if (c[i - 1][j] >= c[i][j - 1]) {// 不相等 // 当上面的数值大 c[i][j] = c[i - 1][j]; b[i][j] = "|";// 指向上边 } else { // 当下面的数值大 c[i][j] = c[i][j - 1]; b[i][j] = "——";// 指向左边 } } } return b;// 方向矩阵 } /** * @see 递归实现回溯,然后打印出最长公共子序列 * @param b 方向矩阵 * @param s 较长的字符串 * @param i 较长串的长度 * @param j 较短串的长度 */ public static void print(String[][] b, String s, int i, int j) { // 递归终止的条件 if (i == 0 || j == 0) { return; } // 判断递归进行的条件 if (b[i][j].equals("\\\\")) { // 遇到斜线,递归到左上角 print(b, s, i - 1, j - 1); System.out.print(s.charAt(i - 1) + " "); } else if (b[i][j].equals("|")) { // 遇到竖线,递归到上边 print(b, s, i - 1, j); } else if (b[i][j].equals("——")) { // 遇到横线,递归到左边 print(b, s, i, j - 1); } } /** * @see 打印二维数组 * @param b 一个二维数组 */ public static void show(int[][] b) { for (int w = 0; w < b.length; w++) { for (int p = 0; p < b[w].length; p++) { System.out.print(b[w][p] + "\\t"); if (p == b[w].length - 1) { System.out.println(); } } } } /** * @see 打印字符串的二维数组 * @param b 一个字符串的二位数组 */ public static void showForString(String[][] b) { for (int w = 1; w < b.length; w++) { System.out.print("\\t"); for (int p = 1; p < b[w].length; p++) { System.out.print(b[w][p] + "\\t"); if (p == b[w].length - 1) { System.out.println(); } } } } }
运行结果:
相关推荐:java入门
The above is the detailed content of Algorithm learning - Java implements the longest common subsequence. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

AdeadlockinJavaoccurswhentwoormorethreadsareblockedforever,eachwaitingforaresourceheldbytheother,typicallyduetocircularwaitcausedbyinconsistentlockordering;thiscanbepreventedbybreakingoneofthefournecessaryconditions—mutualexclusion,holdandwait,nopree

UseOptional.empty(),Optional.of(),andOptional.ofNullable()tocreateOptionalinstancesdependingonwhetherthevalueisabsent,non-null,orpossiblynull.2.CheckforvaluessafelyusingisPresent()orpreferablyifPresent()toavoiddirectnullchecks.3.Providedefaultswithor

The core of SpringDataJPA and Hibernate working together is: 1. JPA is the specification and Hibernate is the implementation, SpringDataJPA encapsulation simplifies DAO development; 2. Entity classes map database structures through @Entity, @Id, @Column, etc.; 3. Repository interface inherits JpaRepository to automatically implement CRUD and named query methods; 4. Complex queries use @Query annotation to support JPQL or native SQL; 5. In SpringBoot, integration is completed by adding starter dependencies and configuring data sources and JPA attributes; 6. Transactions are made by @Transactiona

Understand JCA core components such as MessageDigest, Cipher, KeyGenerator, SecureRandom, Signature, KeyStore, etc., which implement algorithms through the provider mechanism; 2. Use strong algorithms and parameters such as SHA-256/SHA-512, AES (256-bit key, GCM mode), RSA (2048-bit or above) and SecureRandom; 3. Avoid hard-coded keys, use KeyStore to manage keys, and generate keys through securely derived passwords such as PBKDF2; 4. Disable ECB mode, adopt authentication encryption modes such as GCM, use unique random IVs for each encryption, and clear sensitive ones in time
![LOL Game Settings Not Saving After Closing [FIXED]](https://img.php.cn/upload/article/001/431/639/175597664176545.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
IfLeagueofLegendssettingsaren’tsaving,trythesesteps:1.Runthegameasadministrator.2.GrantfullfolderpermissionstotheLeagueofLegendsdirectory.3.Editandensuregame.cfgisn’tread-only.4.Disablecloudsyncforthegamefolder.5.RepairthegameviatheRiotClient.

The Pattern class is used to compile regular expressions, and the Matcher class is used to perform matching operations on strings. The combination of the two can realize text search, matching and replacement; first create a pattern object through Pattern.compile(), and then call its matcher() method to generate a Matcher instance. Then use matches() to judge the full string matching, find() to find subsequences, replaceAll() or replaceFirst() for replacement. If the regular contains a capture group, the nth group content can be obtained through group(n). In actual applications, you should avoid repeated compilation patterns, pay attention to special character escapes, and use the matching pattern flag as needed, and ultimately achieve efficient

Chrome bookmark editing is simple and practical. Users can enter the bookmark manager through the shortcut keys Ctrl Shift O (Windows) or Cmd Shift O (Mac), or enter through the browser menu; 1. When editing a single bookmark, right-click to select "Edit", modify the title or URL and click "Finish" to save; 2. When organizing bookmarks in batches, you can hold Ctrl (or Cmd) to multiple-choice bookmarks in the bookmark manager, right-click to select "Move to" or "Copy to" the target folder; 3. When exporting and importing bookmarks, click the "Solve" button to select "Export Bookmark" to save as HTML file, and then restore it through the "Import Bookmark" function if necessary.
!['Java is not recognized' Error in CMD [3 Simple Steps]](https://img.php.cn/upload/article/001/431/639/175588500160220.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
IfJavaisnotrecognizedinCMD,ensureJavaisinstalled,settheJAVA_HOMEvariabletotheJDKpath,andaddtheJDK'sbinfoldertothesystemPATH.RestartCMDandrunjava-versiontoconfirm.
