对于两个字符串A,B。请设计一个高效算法,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。
给定两个字符串A和B,及它们的长度lena和lenb,请返回题目所求的答案。
测试样例:
"acbc",4,"bc",2
返回:2
import java.util.Scanner; public class Main { //删除输入的整体中的字符'"'为下边以','为间隔将字符串存在字符串数组中做准备 public static String delete (String a) { String b=""; for(int i=0;i<a.length();i++) { if(a.charAt(i)!='"') { b+=a.charAt(i); } } return b; } public static void main(String[] args) { Scanner in=new Scanner(System.in); while(in.hasNext()) { String s=in.next(); String t=delete(s); //以','为间隔存在字符串数组中 String[] arr=t.split(","); //把两个字符串提取出来 String p=arr[0]; String o=arr[2]; //用index.Of查找子字符串的位置,并返回子字符串所对应比较长字符串中的第一个字符的下标,若无,则返回-1 System.out.println(p.indexOf(o)); } } }
总觉得用了封装好的实现类和方法有点走捷径,对于我这种初学者(菜鸡来说)还是应该多学学如何从底层、较为基础的东西去实现它。
import java.util.*;
public class StringPattern {
public int findAppearance(String A, int lena, String B, int lenb) {
// write code here
CharSequence cs = B.toString();
int index = 0;
boolean flag = A.contains(cs);
if (flag) {
index = A.indexOf(B);
return index;
} else {
return -1;
}
}
}
Java一行代码
public int findAppearance(String A, int lena, String B, int lenb) {return
return A.indexOf(B);
}
import java.util.*; public class StringPattern { public int findAppearance(String A, int lena, String B, int lenb) { // write code here if(lena>=lenb){ //如果a的长度小于b直接-1 char []arra = A.toCharArray(); char []arrb = B.toCharArray(); for(int i=0;i<lena-lenb+1;i++){ //进行判定时只要考虑到a长度-b长度的前面几个字符就可 if(judgeStr(arra,arrb,i,lenb)){ return i; } } } return -1; } public boolean judgeStr(char[]arra,char[]arrb,int index,int lenb){ boolean flag=true; for(int i=0;i<lenb;i++){ if(arra[index]!=arrb[i]){ //如果出现一个字符a和b不同则返回false return false; }else{ //每次相同均对index++同步递增两个字符组的位置进行比对 index++; } } return flag; } }
import java.util.*; public class StringPattern { public int[] getNext(String partten, int length) { int[] next = new int[length]; next[0] = -1; int k = -1, j = 0; while (j < length - 1) { if(k == -1 || partten.charAt(k) == partten.charAt(j)) { ++k; ++j; next[j] = k; } else { k = next[k]; } } return next; } public int findAppearance(String A, int lena, String B, int lenb) { int[] next = getNext(B, lenb); int i = 0, j = 0; while (i < lena && j < lenb) { if(j == -1 || A.charAt(i) == B.charAt(j)) { ++i; ++j; } else { j = next[j]; } } if (j == lenb) return i - j; return -1; } }
public int findAppearance(String A, int lena, String B, int lenb) { char[] AA = A.toCharArray(); char[] BB = B.toCharArray(); int f = -1; int b = 0; if(lena>=lenb){ for(int a=0;a<lena;a++){ while(b<lenb){ if(BB[b]!=AA[a]){ if((lena-a)<=(lenb-b)){//若剩余的a字符数组小于b数组 return -1; } if(f<0){ break; }else{ if(BB[0]==AA[a]){ f=a; if(lenb==1){ return f; } b=1; }else{ b=0; } break; } } if(BB[b]==AA[a]){ f=a; if(b==(lenb-1)){ return f-lenb+1; } b++; break; } } } } return -1; }
35ms,709k,写的有点麻烦了。。。
最简单的方法:使用STL算法,不过这种方法在面试时不吃香,毕竟体现不出逻辑分析过程。写完整算法过程,最好分A字符串和B字符串的长度大小比较情况进行编码。
import java.util.*; public class StringPattern { public int findAppearance(String A, int lena, String B, int lenb) { if( ! A.contains(B)) return - 1; char[] chA = A.toCharArray(); char[] chB = B.toCharArray(); boolean isFinded = false; int res = 0; for (int i = 0; i <= lena - lenb; i ++ ) { if(chA[i] != chB[0]) continue; boolean isMatched = true; for (int j = i, k = 0; k < lenb; j ++ , k ++ ) { if(chA[j] != chB[k]) { isMatched = false; break; } } if(isMatched) { isFinded = true; res = i; break; } } if(isFinded) return res; else return - 1; } }
import java.util.*; public class StringPattern { public int findAppearance(String A, int lena, String B, int lenb) { // write code here int index = -1; for(int i = 0; i <= lena-lenb ;i++){ String s1 = A.substring(i,i+lenb); if(s1.equals(B)){ index = i; break; } } return index; } }