题目:*~公共子串的计算
题目描述 给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。
注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。
输入描述: 输入两个只包含小写字母的字符串输出描述: 输出一个整数,代表最大公共子串的长度
题解:
求最大公共子串,使用递推实现假设
x(i): 字符串第i个字符 y(j): 字符串第j个字符dp[i][j]:
以x(i),y(j)结尾的最大子串长度比如:x: “abcde” y:“bcdae”
dp[2][1]: 以x(2),y(1)结尾的最大子串长度即:x遍历到"abc", y遍历到"bc",
都以字符’c’结尾时最大公共子串为"bc"
故:当计算dp[i][j]时,首先看x(i),y(j)的值:
(1): x(i) == y(j)当前两个字符串结尾的字符相等,dp[i][j] = dp[i-1][j-1] + 1即个它的长度加1
(2): x(i) !=y(j)当前两个字符串结尾的字符不相等,说明没有以这连个字符结尾的公共子串即dp[i][j] = 0当dp中的所有元素计算完之后,从中找打最大的值输出
import java.util.*;
public class Main{
public static int getMaxLen(String str1,String str2){
char[] arr1=str1.toCharArray();
char[] arr2=str2.toCharArray();
int len1=arr1.length;
int len2=arr2.length;
int[][] maxsublen=new int[len1+1][len2+1];
int maxlen=0;
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(arr1[i-1]==arr2[j-1]){
maxsublen[i][j]=maxsublen[i-1][j-1]+1;
if(maxlen<maxsublen[i][j]){
maxlen=maxsublen[i][j];
}
}
}
}
return maxlen;
}
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
String str1=scan.nextLine();
String str2=scan.nextLine();
System.out.println(getMaxLen(str1,str2));
}
}
}
题目:*~字符串反转
题目描述 接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
输入描述: 输入一行,为一个只包含小写字母的字符串。 输出描述: 输出该字符串反转后的字符串。
解题:
字符串反转,需要交换首尾字符,设置首尾两个位置start,end,每次交换首尾字符,然后start++, end–,直到start,end相遇,反转完成。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
String str=scan.nextLine();
char[] ret=str.toCharArray();
int start=0;
int end=ret.length-1;
while(start<end){
char tmp=ret[start];
ret[start]=ret[end];
ret[end]=tmp;
start++;
end--;
}
System.out.println(ret);
}
}
}