本篇博文用java实现了数据结构中的字符串操作,包括Brute-Force和KMP模式匹配算法
源码分享在github:数据结构,当然你也可以从下面的代码片中获取
1.字符串的接口定义 IString .java
package code.string;
public interface IString {public void clear();public boolean isEmpty();public int length();public char charAt(int index);
2.字符串的顺序存储实现 SeqString .java
package code.string;
public class SeqString implements IString{private char [] strValue;private int curLen;public SeqString(){strValue &#61; new char[0];curLen &#61; 0;}public SeqString(String str){char [] tempCharArray &#61; str.toCharArray();strValue &#61; tempCharArray;curLen &#61; tempCharArray.length;}public SeqString(char [] value){this.strValue &#61; new char[value.length];for (int i &#61; 0;i<value.length;i&#43;&#43;){this.strValue[i] &#61; value[i];}curLen &#61; value.length;}public void allocate(int newCapacity){char [] temp &#61; strValue;strValue &#61; new char[newCapacity];for (int i &#61; 0;i<temp.length;i&#43;&#43;){strValue[i] &#61; temp[i];}}&#64;Overridepublic void clear() {this.curLen &#61; 0;}&#64;Overridepublic boolean isEmpty() {return curLen &#61;&#61; 0;}&#64;Overridepublic int length() {return curLen;}&#64;Overridepublic char charAt(int index) {if ((index < 0)|| (index >&#61; curLen)){throw new StringIndexOutOfBoundsException(index);}return strValue[index];}&#64;Overridepublic IString substring(int begin, int end) {if (begin < 0){throw new StringIndexOutOfBoundsException("起始位置不能小于0");}if (end > curLen){throw new StringIndexOutOfBoundsException("结束位置不能大于串的当前长度:"&#43;curLen);}if (begin >&#61; end){throw new StringIndexOutOfBoundsException("开始位置不能大于等于结束位置");}if (begin &#61;&#61; 0 && end &#61;&#61; curLen){return this;} else {char [] buff &#61; new char[end - begin];for (int i &#61; 0;i<buff.length;i&#43;&#43;){buff[i] &#61; this.strValue[i&#43;begin];}return new SeqString(buff);}}&#64;Overridepublic IString insert(int offset, IString str) {if ((offset < 0)||(offset > this.curLen)){throw new StringIndexOutOfBoundsException("插入位置不合法");}int len &#61; str.length();int newCount &#61; this.curLen&#43;len;if (newCount > strValue.length) {allocate(newCount);}for (int i &#61; this.curLen - 1;i >&#61; offset;i--){strValue[len&#43;i] &#61; strValue[i];}for (int i &#61; 0;i < len;i&#43;&#43;){strValue[offset&#43;i] &#61; str.charAt(i);}this.curLen &#61; newCount;return this;}&#64;Overridepublic IString delete(int begin, int end) {if (begin < 0){throw new StringIndexOutOfBoundsException("起始位置不能小于0");}if (end > curLen){throw new StringIndexOutOfBoundsException("结束位置不能大于串当前长度"&#43;curLen);}if (begin >&#61; end){throw new StringIndexOutOfBoundsException("开始位置不能大于等于结束位置");}for (int i &#61; 0;i < curLen-end;i&#43;&#43;){strValue[begin&#43;i] &#61; strValue[end&#43;i];}curLen &#61; curLen-(end - begin);return this;}&#64;Overridepublic IString concat(IString str) {return insert(curLen,str);}&#64;Overridepublic int compareTo(IString str) {int len1 &#61; curLen;int len2 &#61; ((SeqString) str).curLen;int n &#61; Math.min(len1,len2);char[] s1 &#61; strValue;char[] s2 &#61; ((SeqString) str).strValue;int k &#61; 0;while (k<n){char ch1 &#61; s1[k];char ch2 &#61; s2[k];if (ch1 !&#61; ch2){return ch1 - ch2;}k&#43;&#43;;}return len1 - len2;}public int indexOf_BF(IString t,int start){if (this !&#61; null && t!&#61;null && t.length()>0&&this.length()>&#61;t.length()){int sLen,tLen,i &#61; start,j &#61; 0;sLen &#61; this.length();tLen &#61; t.length();while ((i<sLen)&&(j<tLen)){if (this.charAt(i)&#61;&#61;t.charAt(j)){i&#43;&#43;;j&#43;&#43;;}else {i &#61; i-j&#43;1;j &#61; 0;}}if (j>&#61;t.length()) {return i - tLen;}else {return -1;}}return -1;}private int[] getNextVal(IString T){int [] nextVal &#61; new int[T.length()];int j &#61; 0;int k &#61; -1;nextVal[0] &#61; -1;while (j<T.length()-1){if (k &#61;&#61; -1||T.charAt(j) &#61;&#61; T.charAt(k)){j&#43;&#43;;k&#43;&#43;;if (T.charAt(j) !&#61; T.charAt(k))nextVal[j] &#61; k;elsenextVal[j] &#61; nextVal[k];}elsek &#61; nextVal[k];}return nextVal;}public int index_KPM(IString T,int start){int [] next &#61; getNextVal(T);int i &#61; start;int j &#61; 0;while (i<this.length()&& j<T.length()){if (j &#61;&#61; -1||this.charAt(i)&#61;&#61;T.charAt(j)){i&#43;&#43;;j&#43;&#43;;}else {j &#61; next[j];}}if (j<T.length()){return -1;}else {return (i-T.length());}}&#64;Overridepublic int indexOf(IString str, int begin) {return index_KPM(str,begin);}
}
数据结构这个系列是我学习时做的笔记&#xff0c;会持续更新&#xff0c;详见我的github&#xff08;地址在文章开头&#xff09;或我的其他博文&#xff0c;感觉不错的话&#xff0c;关注一下吧!