首页 > 试题广场 >

串的模式匹配

[编程题]串的模式匹配
  • 热度指数:13735 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

对于两个字符串A,B。请设计一个高效算法,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。

给定两个字符串AB,及它们的长度lenalenb,请返回题目所求的答案。

测试样例:
"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)); 
    }
}
}

发表于 2019-03-02 15:26:55 回复(0)
发表于 2018-09-08 21:03:11 回复(0)
送分题:
public int findAppearance(String A, int lena, String B, int lenb) {
        for(int i=0;i<lena-lenb+1;i++){
            if(A.subSequence(i, i+lenb).equals(B))
                return i;
        }
        return -1;
    }

发表于 2018-08-18 17:39:59 回复(0)

总觉得用了封装好的实现类和方法有点走捷径,对于我这种初学者(菜鸡来说)还是应该多学学如何从底层、较为基础的东西去实现它。

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;
        }
    }
}
编辑于 2018-05-01 10:47:00 回复(0)
Java一行代码
public int findAppearance(String A, int lena, String B, int lenb) {return 
 return A.indexOf(B);
}


编辑于 2018-03-26 21:11:45 回复(0)
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;
    }
}
发表于 2018-01-24 11:23:06 回复(0)
  public int findAppearance(String A, int lena, String B, int lenb) {
        // write code here
        //法一
       // return A.indexOf(B);
        //法二
        for(int i=0;i<=lena-lenb;i++)
            {
                if(B.charAt(0)==A.charAt(i) )
                {
                    String sub=A.substring(i,i+lenb);
                    if(sub.equals(B))
                    {
                        return i;
                    }
                }
            }
        
        return -1;
        
    }
发表于 2017-11-09 16:54:30 回复(0)
复习一下KMP
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;
    }
}

发表于 2017-08-22 10:14:50 回复(0)
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,写的有点麻烦了。。。

编辑于 2017-03-24 22:59:09 回复(0)
最简单的方法:使用STL算法,不过这种方法在面试时不吃香,毕竟体现不出逻辑分析过程。写完整算法过程,最好分A字符串和B字符串的长度大小比较情况进行编码。

发表于 2017-02-27 09:13:31 回复(0)
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;
	}
}

编辑于 2016-09-08 16:30:32 回复(0)
import java.util.*;

public class StringPattern {
    public int findAppearance(String T, int lena, String P, int lenb) {
        // write code here
        int i=0;//模式串相对于主串的起始位置
int j=0;//模式串当前字符的地址
for (i=0; i <= lena-lenb+1; i++)
{//主串从第i个字符起,与
//模式串的当前字符逐次比较
for (j=0; j<lenb; j++)
{//charAT返回指定位置字符
if (T.charAt(i+j) != P.charAt(j)) break;//若失配,模式串右移一个字符
}
if (j >= lenb) break;//找到匹配子串
}
        
return(i<=Math.abs(lena - lenb)?i:-1);
    }
}
发表于 2016-07-27 18:15:15 回复(0)
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;
    }
}

发表于 2016-07-14 22:38:18 回复(0)