前言
计算机中的非数值处理的对象基本上是字符串数据,随着语言加工程序的发展,字符串作为一种变量类型出现在越来越多的程序设计语言中,同时也产生了一系列的字符串操作。在日常的程序设计中,如名称、地点等信息都是以字符串形式表示的,又如文本框、输入框等都是以字符串数据作为处理对象。
什么是字符串
字符串(string),或者直接叫作串,是由零个或多个字符组成的有限序列。
串中字符的个数称为串的长度,当字符个数为0时,此时串被称为空串。
由一个或多个空格组成的串称为空格串,需要注意的是空串不等于空格串,虽然它们看起来都没有内容。
String str1 = "Jack";
String str2 = "123@qq.com";
String str3 = ""; // 空串
String str4 = " "; // 空格串(一个空格)
串中任意个(包含0个)连续的字符组成的子序列称为该串的子串,包含子串的串称为主串,子串第一个字符在主串中的位置表示该子串在主串中的位置。
String str1 = "helloworld!";
String str2 = "ll"; // str2 是 str1 的子串,它在 str1 中的位置为 2
当两个串的值相等时,称两个字符串相等。
String str1 = "WuHan";
String str2 = "WuHan"; // str1 与 str2 相等
字符串的表示和实现
字符串有时不仅仅是一个表示特定信息的常量,它有时候也以变量的形式出现。字符串通常有三种机内表示方法。
定长顺序存储表示
类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值额字符序列。
堆分配存储表示
以一组地址连续的存储单元存放串值字符序列,但存储空间是在程序执行过程中动态分配的。
块链存储表示
和线性表的链式存储结构相类似,采用链表方式存储串值。
串的模式匹配
模式匹配是数据结构中字符串的一种基本运算,是各种串处理系统中的最重要的操作之一。
设 S 是给定的主串,T 是给定的子串,在主串 S 中查找等于子串 T 的串的过程就是模式匹配的过程,T 称为模式串。如果在 S 中找到 T 子串,则称匹配成功,函数返回 T 在 S 中首次出现的存储位置,否则匹配失败,返回-1。
字符串匹配算法有很多,这里只介绍两种最常见的算法。
BF(Brute-Force)算法
原理
最朴素的想法就是枚举主串的每一个字符,以每一个字符为起始点,与模式串的第一个字符开始尝试匹配,如果相同继续匹配主串和模式串的下一个字符,如果不同,从主串下一个字符再次开始匹配。
如果在一次匹配过程中匹配到模式串的最后一个字符,则匹配成功,否则失败。
代码实现
public int myBFIndexOf(String S, String T) {
int n = S.length(), m = T.length();
// pos 为本轮匹配主串的起始字符位置,不能大于主串长度减模式串长度的差
// 因为当 pos > n - m 时,一定会匹配失败
for(int pos = 0; pos <= n - m