【问题标题】:Compare two strings and check if a common string can be built by deleting characters比较两个字符串并检查是否可以通过删除字符来构建公共字符串
【发布时间】:2018-07-13 18:55:34
【问题描述】:

我正在尝试解决任何给定两个字符串的 ASCII 距离问题。我编写了代码来检查两个字符串之间的不匹配字符并计算出部分 ascii 距离。但是我仍然需要比较两个字符串(例如,如下所示。)并提出一个可以用这些字符串构建的通用字符串。下面是一个例子。

Let's say s1="elete" s2="leet"

Expected Output:
"let"

在上述示例的情况下,如何识别两个字符串中的多余字符并得出一个通用字符串?

我的代码如下所示,它的作用是比较两个字符串并计算两个字符串之间不匹配字符的 ASCII 分数。

代码:

class Solution {
    public int minimumDeleteSum(String s1, String s2) {

        int sum = 0;

        char[] cstr1 = s1.toCharArray();
        char[] cstr2 = s2.toCharArray();

        String res = compareCharacters( cstr1,cstr2 );

        sum += Integer.parseInt( res.split(",")[1] );
        String news1 = res.split(",")[0];

        res = compareCharacters( cstr2,cstr1 );        
        sum += Integer.parseInt( res.split(",")[1] );
        String news2 = res.split(",")[0];

        /*Would like to add the code here to get all characters that are not allowing to build a common string and get their ASCII values.How do I approach this problem? */

        return sum;
    }

    public String compareCharacters( char[] cstr1, char[] cstr2 ){

        int ascii_score = 0;
        int flag = 0;
        StringBuilder sb = new StringBuilder();

        for( int i=0;i<cstr1.length;i++ ){
            flag = 0;
            for( int j=0;j<cstr2.length;j++ ){
            if( cstr1[i] == cstr2[j] )  
                flag++;
            }
            if( flag == 0 ){
                ascii_score += (int)cstr1[i];
                cstr1[i] = '\0';
            }
            if( flag>0 )
                sb.append(cstr1[i]);                
        }          

        return sb.toString()+','+Integer.toString(ascii_score);
    }

}

如果有任何问题,请告诉我。提前致谢!!

【问题讨论】:

  • 寻找 LCS(最长公共子序列)算法

标签: java arrays string algorithm


【解决方案1】:

https://stackoverflow.com/a/51334221/1139196 的副本。我稍微修改了代码以匹配您的问题。

import java.util.Arrays;
import java.util.List;

public class LongestCommonSubstring {
    public static char[] lcs(List l1, List l2) {
        int[][] d = new int[l1.size() + 1][l2.size() + 1];
        for (int i1 = 1; i1 <= l1.size(); i1++) {
            for (int i2 = 1; i2 <= l2.size(); i2++) {
                if (l1.get(i1 - 1).equals(l2.get(i2 - 1))) {
                    d[i1][i2] = d[i1 - 1][i2 - 1] + 1;
                } else {
                    d[i1][i2] = Math.max(d[i1 - 1][i2], d[i1][i2 - 1]);
                }
            }
        }
        int i1 = l1.size(), i2 = l2.size();
        char[] result = new char[d[i1][i2]];
        while (i1 > 0 && i2 > 0) {
            if (l1.get(i1 - 1).equals(l2.get(i2 - 1))) {
                result[d[i1][i2] - 1] = ((String) l1.get(i1 - 1)).charAt(0);
                i1 -= 1;
                i2 -= 1;
            } else if (d[i1][i2] == d[i1 - 1][i2]) {
                i1 -= 1;
            } else {
                i2 -= 1;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        List l1 = Arrays.asList("elete".split(""));
        List l2 = Arrays.asList("leet".split(""));
        System.out.println(new String(lcs(l1, l2)));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多