数据结构Java:算法设计: 已知两个字符串s1="fg cdb cabcadr",s2="abc",运用链式存储结构存储这两个字符串,试求这两个串的长度,判断第二个字符串S2是否是第一个字符串s1的子串,并指出S2在S1中的位置。
时间: 2024-10-25 17:03:34 浏览: 28
在Java中,我们可以使用链表作为数据结构来存储字符串。每个字符作为一个节点,包含其字符值和指向下一个字符的引用。对于给定的两个字符串s1和s2,我们首先需要计算它们各自的长度,然后检查s2是否在s1中出现。
1. **计算字符串长度**:
对于链表表示的字符串,我们可以通过遍历每个节点并计数来获取长度。例如,对s1,我们会从头节点开始,直到遇到`null`为止,记录下经过的节点数就是长度。
2. **判断子串**:
我们可以设置两个指针,一个指向s1的头部,另一个指向s2的头部。逐个比较两者当前的字符,如果匹配,则移动到下一个字符;如果不匹配且s2的指针到达了结尾,那么s2就不是s1的子串。反之,如果s2的指针先到达了结尾,说明找到了子串结束的位置。
3. **定位子串位置**:
如果找到s2是s1的子串,记录下s1当前指针与s1起始点之间的距离(因为我们的索引是从0开始的),这就是s2在s1中的起始位置。由于链表已经按照字符顺序排列,这个位置即为相对应的字符位置。
下面是简单的伪代码描述上述过程:
```java
Node s1Head = buildLinkedList(s1); // 构建s1的链表
int s1Length = getLength(s1Head); // 获取s1长度
// 检查s2是否是s1的子串
boolean isSubstring;
int s2Index = -1;
for (int i = 0; i < s1Length && !isSubstring; i++) {
if (s1Head.data == s2.head.data) {
Node s2Current = s2Head;
for (int j = 0; j < s2.length && s1Head.data == s2Current.data; j++, s1Head = s1Head.next) {
s2Current = s2Current.next;
}
if (s2Current == null) { // s2完全匹配
isSubstring = true;
s2Index = i;
} else {
break;
}
}
}
// 返回结果
if (isSubstring) {
System.out.println("s2是s1的子串,位置是:" + s2Index);
} else {
System.out.println("s2不是s1的子串");
}
```
阅读全文