数据结构之串

来源:互联网 发布:三洋微波炉怎么样知乎 编辑:程序博客网 时间:2024/05/20 12:48

总结自《数据结构》
(1)概念:字符串是由字符组成的有限序列,是计算机中最常用的一种非数值数据,从逻辑结构看,串是一种特殊的线性表,其特殊性在于线性表中的每个元素是一个字符。
(2)串的模式匹配:目标串target和模式串pattern,在目标串target中查找与模式串pattern相等的一个子串,并确定该子串位置的操作。有两种模式匹配算法:Brute-Force算法和KMP算法。
(3)Brute-Force算法:回溯算法

/** * @date 2017-06-25 * @author liufeifei * @description 串匹配 */public class BruteForceTest {    //str是主串,subStr是字串,返回匹配开始的位置    public static int match(String str,String subStr){        //如果子串为空就返回-1        if(null == subStr && subStr.length() <= 0){            return -1;        }        //主串的长度        int strlen = str.length();        //子串的长度        int subStrlen = subStr.length();        //外层遍历结束的位置,从end开始后面的串长度小于子串subStr        int end = strlen - subStrlen;        int i = 0;        //是否符合的标志        boolean isSuit = true;        //主串i位置开始,与子串0位置匹配,如果第一个相等,主串i+1(i+j)和字串1(j)位置比较。        //主串i位置开始,与子串0位置匹配,如果不相等,就结束内层循环,从主串i+1位置和子串0位置开始比较        for(i = 0;i < end;i++){            isSuit = true;            for(int j = 0;j < subStrlen;j++){                if(str.charAt(i+j) != subStr.charAt(j)){                    isSuit = false;                }            }            if(isSuit){                break;            }        }        if(!isSuit){            return -1;        }        return i;    }    public static int match1(String str,String substr){        int i = 0;//标志str指针位置的移动        int j = 0;//标志substr指针位置的移动        int strlen = str.length();        int substrlen = substr.length();        while(i < strlen && j < substrlen){            if(str.charAt(i) == substr.charAt(j)){                i++;//匹配移动到主串下一位                j++;//匹配移动到模式串下一位            }else{                //不匹配                i = i - j + 1;//回溯移动到原来的下一位开始匹配                j = 0;//模式串从头开始匹配            }        }        if(j == substrlen){            //匹配成功,返回主串开始的位置            return i-substrlen;        }        //匹配不成功,返回-1        return -1;    }    public static void main(String args[]){        String str = "abcedfg";        String substr = "df";        int index1 = BruteForceTest.match1(str, substr);        System.out.println(index1);        int index = match(str,substr);        if(index != -1){            System.out.println("匹配开始的位置是:"+index);        }else{            System.out.println("匹配不成功");        }    }}

(4)KMP算法

package gdut.ff.kmp;import org.junit.Test;/** *  * @date 2017-6-30 * @author liufeifei * @description 串的模式匹配 KMP算法 */public class KmpTest {    public static int indexOf(String target,String pattern,int begin){        int i = begin,j = 0;        int[] next = getNext(pattern);        while(i < target.length()){            if(j == -1 || target.charAt(i) == target.charAt(j)){                i++;                j++;            }else{                j = next[j];            }            if(j == pattern.length()){                return i-j;            }        }        return -1;    }    public static int indexOf(String target,String pattern){        return indexOf(target,pattern,0);    }    //寻找前后缀字串    private static int[] getNext(String pattern){        int j = 0,k = -1;        int next[] = new int[pattern.length()];        next[0] = -1;        while(j < pattern.length() - 1){            if(k == -1 || pattern.charAt(k) == pattern.charAt(j)){                j++;                k++;                //next[j] = k;                if(pattern.charAt(j) != pattern.charAt(k)){                    next[j] = k;                }else{                    next[j] = next[k];                }            }else{                k = next[k];            }        }        return next;    }    @Test    public void test(){        int[] next = getNext("abcabcaa");        for(int i = 0;i < next.length;i++){            System.out.print(next[i] + " ");        }        System.out.println();        String pattern = "abc";        String target = "ababababc";        int loc = indexOf(target,pattern);        System.out.println(loc);    }}
原创粉丝点击