第一题
/*
问题1:求S2在S1中出现的次数
s1=“abcabcbcacbabbabcba”
s2=“abc”
推荐算法:KMP算法
*/
public static void question1(){
/*
问题1:求S2在S1中出现的次数
s1="abcabcbcacbabbabcba"
s2="abc"
*/
String s1="abcabcbcacbabbabcba";
String s2="abc";
int count=0;
for(int i=0;i<s1.length()-s2.length()+1;i++){
String sub=s1.substring(i,i+s2.length());
if(sub.equals(s2)){
count++;
}
}
System.out.println("s2在s1中出现了"+count+"次");
}
从s1的开始开始循环,依次右移,判断等于s2就给计数器加一,最后输出。
第二题
/*
问题2:判断字符串s是否是回文
s=“上海自来水来自海上”
*/
public static void question2(){
/*
问题2:判断字符串s是否是回文
s="上海自来水来自海上"
*/
String s="上海自来水来自海上";
int left=0;
int right=s.length()-1;
boolean flag=true;
while(true){
if(s.charAt(left)==s.charAt(right)){
left++;
right--;
if(left>=right){
break;
}
}else{
flag=false;
break;
}
}
System.out.println("s是回文吗:"+flag);
}
定义两个指针,一个从头开始,一个从尾开始,同步向中间移动,如果哪一次不相等就直接跳出循环,最后输出不是回文,如果循环正常结束就是两个指针相遇或者走过了就跳出循环。最后看是不是正常跳出循环的。
第三题
/*
问题3:模拟trim的功能,自定义实现
s=" 安利给~ "
*/
public static void question3() {
/*
* 问题3:模拟trim的功能,自定义实现 s=" 安利给~ "
*/
String s = " 安利给~ ";
int left = 0;
int right = s.length() - 1;
while (s.charAt(left) == " ") {
left++;
}
while (s.charAt(right) == " ") {
right--;
}
String res = s.substring(left, right + 1);
System.out.println("[" + res + "]");
}
从头和尾分别开始,如果等于空格,那么一直向中间移动,最后记录两端不是空格的位置,用substring函数截取这一段即可。
第四题
/*
* 问题4:求S1和s2中最大的相同子串(s1.length()>s2.length())
* s1=“Python is a program language but is slow”;
* s2=“Java is a program language but is fast”;
*/
public static void question4() {
/*
* 问题4:求S1和s2中最大的相同子串(s1.length()>s.length())
* s1="Python is a program language but is slow";
* s2="Java is a program language but is fast"; " is a program language but is "
*/
final String s1 = "Python is a program language but is slow";
final String s2 = "Java is a program language but is fast";
boolean flag = true;
for (int len = s2.length(); len >= 1; len--) {
for (int i = 0, j = len - 1; j < s2.length(); j++, i++) {
final String sub = s2.substring(i, j + 1);
System.out.println(sub);
if(s1.contains(sub)){
flag=false;
System.out.println("结果是["+sub+"]");
break;
}
}
if(!flag){
break;
}
}
用小的跟大的比,开始时看全部在不在里面,然后循环依次给长度减一,二层循环i从0开始,j从截取的长度开始,如果不包含就右移,直到j移动到了顶头,如果循环结束都没有找到,就输出了false,否则输出相应的字符串。