对于两个字符串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;
}
}