数据结构之串
来源:互联网 发布:三洋微波炉怎么样知乎 编辑:程序博客网 时间: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); }}
阅读全文
0 0
- 数据结构之串
- 数据结构基础之串
- 数据结构基础之串
- 数据结构之串
- 数据结构复习之串
- 数据结构之串
- 数据结构之------串
- 数据结构之串
- 数据结构之“串”
- 数据结构之串
- 数据结构之串笔记
- 数据结构之顺序串(整理严蔚敏数据结构)
- 数据结构与算法之----串
- 数据结构之——串
- 数据结构之串的应用
- 数据结构之最大子串
- 数据结构实验之串一
- 数据结构实验之串三
- 作业5 oracle 安全管理
- markdown基础
- 动态参数
- solrCloud 在window上简单模拟搭建环境
- React笔记加报错
- 数据结构之串
- AttributeError: 'Bunch' object has no attribute 'data'
- 自然常数e
- 谈谈Spring中的IOC和AOP概念
- Photoshop抠图(磁性套索工具及几个常用案例)
- Java-算法分析及其优劣判断
- Dcm4chee学习笔记(三)--StoreSCP服务流程剖析
- Apache Kafka 入门
- Golang 服务器端对客户端的证书进行校验(双向证书校验)