统计不同字符数 【问题描述】 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 Given a string, Please find out the length of the longest substring that does not contain repeated characters. 提示:相同字符大小写算做两个不同字符,如Aa为2 【输入形式】 字符串的内容 【输出形式】 不含有重复字符的最长子串的长度 【样例输入】 abcabcbb 【样例输出】 3
时间: 2023-10-14 19:11:23 浏览: 72
好的,这就是队列4-统计不同字符数的问题,非常感谢您的提醒和纠正。下面是 Python 的解法,使用双指针和哈希表来记录子串中出现的字符及其出现的次数:
```python
def length_of_longest_substring(s: str) -> int:
left, right = 0, 0
freq = {}
res = 0
while right < len(s):
c = s[right]
if c in freq:
freq[c] += 1
else:
freq[c] = 1
while freq[c] > 1:
d = s[left]
freq[d] -= 1
left += 1
res = max(res, right - left + 1)
right += 1
return res
```
您可以将输入字符串作为参数传递给 `length_of_longest_substring` 函数,然后它会返回不含有重复字符的最长子串的长度。对于输入样例 `"abcabcbb"`,函数的返回值应该为 `3`。
相关问题
队列4-统计不同字符数 【问题描述】 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 Given a string, Please find out the length of the longest substring that does not contain repeated characters. 提示:相同字符大小写算做两个不同字符,如Aa为2 【输入形式】 字符串的内容 【输出形式】 不含有重复字符的最长子串的长度 【样例输入】 abcabcbb 【样例输出】 3
您的问题是关于字符串的问题,需要找出其中不含有重复字符的最长子串的长度。以下是一种可能的解法:
可以使用双指针(滑动窗口)的方法来解决这个问题。具体步骤如下:
1. 定义两个指针,分别指向子串的起始位置和结束位置,并定义一个哈希表,用于存储已经出现过的字符及其出现的位置。
2. 从字符串的第一个字符开始遍历,将起始指针指向该字符,并将该字符及其位置存入哈希表中。
3. 然后,将结束指针向后移动一位,再将哈希表中存储的字符及其位置与当前字符比较,如果当前字符已经在哈希表中出现过,那么将起始指针向后移动一位,并删除哈希表中对应的字符及其位置,直到哈希表中不再有当前字符为止。
4. 每次移动结束指针时,都要计算当前子串的长度,并与之前记录的最大长度进行比较,更新最大长度。
5. 遍历完整个字符串后,即可得到最长的不含重复字符的子串的长度。
下面是代码实现:
用C语言队列实现:【问题描述】 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 Given a string, Please find out the length of the longest substring that does not contain repeated characters. 提示:相同字符大小写算做两个不同字符,如Aa为2 【输入形式】 字符串的内容 【输出形式】 不含有重复字符的最长子串的长度 【样例输入】 abcabcbb 【样例输出】 3
以下是用C语言队列实现的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_QUEUE_SIZE 1000
typedef struct {
char data[MAX_QUEUE_SIZE];
int front;
int rear;
} Queue;
void initQueue(Queue *q) {
q->front = q->rear = 0;
}
int isQueueEmpty(Queue *q) {
return q->front == q->rear;
}
int isQueueFull(Queue *q) {
return (q->rear + 1) % MAX_QUEUE_SIZE == q->front;
}
void enqueue(Queue *q, char c) {
if (isQueueFull(q)) {
fprintf(stderr, "Error: queue is full\n");
return;
}
q->data[q->rear] = c;
q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
}
char dequeue(Queue *q) {
if (isQueueEmpty(q)) {
fprintf(stderr, "Error: queue is empty\n");
return '\0';
}
char c = q->data[q->front];
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return c;
}
int maxLengthSubstring(char *s) {
int n = strlen(s);
int maxLen = 0;
Queue q;
initQueue(&q);
for (int i = 0; i < n; i++) {
char c = s[i];
int j;
for (j = q.front; j != q.rear; j = (j + 1) % MAX_QUEUE_SIZE) {
if (q.data[j] == c) {
break;
}
}
if (j != q.rear) {
// found repeated character, dequeue until no repeat
while (!isQueueEmpty(&q) && q.data[q.front] != c) {
dequeue(&q);
}
dequeue(&q);
}
enqueue(&q, c);
int len = q.rear - q.front;
if (len > maxLen) {
maxLen = len;
}
}
return maxLen;
}
int main() {
char s[1000];
scanf("%s", s);
printf("%d\n", maxLengthSubstring(s));
return 0;
}
```
算法思路:
使用队列维护一个滑动窗口,窗口内的字符都是不重复的。遍历字符串,对于每个字符,判断是否在窗口内出现过,如果是则将队列中该字符之前的所有字符出队,直到队列中不含有该字符,然后将该字符入队,更新最长不重复子串的长度。
阅读全文