当前位置: 首页 > wzjs >正文

建网站潞城哪家强?网站怎么优化推广

建网站潞城哪家强?,网站怎么优化推广,电子商务网站开发设计案例—易趣网电子商务网站,视频网站直播怎么做的无重复字符的最长子串(C语言实现) 一、问题描述示例提示 二、问题分析1. **问题难点**2. **解决方案** 三、C语言实现1. **使用 uthash 的实现**代码实现代码说明 2. **不使用 uthash 的实现**代码实现代码说明 四、sizeof(s) 的错误问题分析&#xff1a…

无重复字符的最长子串(C语言实现)

    • 一、问题描述
      • 示例
      • 提示
    • 二、问题分析
      • 1. **问题难点**
      • 2. **解决方案**
    • 三、C语言实现
      • 1. **使用 `uthash` 的实现**
        • 代码实现
        • 代码说明
      • 2. **不使用 `uthash` 的实现**
        • 代码实现
        • 代码说明
    • 四、sizeof(s) 的错误问题分析:
    • 五、测试用例
      • 1. **测试用例 1**
      • 2. **测试用例 2**
      • 3. **测试用例 3**
    • 六、总结
    • 七、参考文献

一、问题描述

给定一个字符串 s,请你找出其中不含有重复字符的最长子串的长度。

示例

  1. 输入s = "abcabcbb"

    • 输出3
    • 解释:无重复字符的最长子串是 "abc",长度为 3。
  2. 输入s = "bbbbb"

    • 输出1
    • 解释:无重复字符的最长子串是 "b",长度为 1。
  3. 输入s = "pwwkew"

    • 输出3
    • 解释:无重复字符的最长子串是 "wke",长度为 3。注意,"pwke" 是一个子序列,不是子串。

提示

  • 0 <= s.length <= 5 * 10^4
  • s 由英文字母、数字、符号和空格组成。

二、问题分析

1. 问题难点

  • 如何高效地判断一个子串中是否存在重复字符?
  • 如何在发现重复字符时,快速更新子串的边界?

2. 解决方案

  • 使用滑动窗口技术,通过两个指针 lr 表示子串的左右边界。
  • 使用一个辅助数据结构(如哈希表或数组)记录字符的出现情况,以便快速判断字符是否重复。

三、C语言实现

1. 使用 uthash 的实现

代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uthash.h>typedef struct {char key; // 哈希集合保存的元素UT_hash_handle hh; // uthash 需要
} hashTable;int lengthOfLongestSubstring(char* s) {int result = 0;int l = 0, r = 0;int n = strlen(s); // 获取字符串的实际长度hashTable* hashMap = NULL; // 创建一个空哈希集合hashTable* hashNode;for (r = 0; r < n; r++) {char key = s[r];HASH_FIND_INT(hashMap, &key, hashNode);if (hashNode == NULL) { // 如果 s[r] 不在集合中,则插入hashNode = (hashTable*)malloc(sizeof(hashTable));hashNode->key = key;HASH_ADD_INT(hashMap, key, hashNode);} else { // 如果找到重复字符// 更新最长子串长度result = (r - l > result) ? r - l : result;// 从左边界开始逐个删除字符,直到删除重复字符为止while (s[l] != s[r]) {HASH_DEL(hashMap, hashNode);free(hashNode);l++;HASH_FIND_INT(hashMap, &s[l], hashNode);}l++; // 移动左边界到重复字符的下一个位置}}// 最后一次更新最长子串长度result = (r - l > result) ? r - l : result;// 清空哈希表并释放内存HASH_CLEAR(hh, hashMap);return result; // 返回最长无重复子串的长度
}int main() {char s[100];printf("请输入字符串: ");scanf("%99s", s); // 防止输入溢出int result = lengthOfLongestSubstring(s);printf("无重复字符的最长子串长度为: %d\n", result);return 0;
}
代码说明
  1. 滑动窗口

    • 使用两个指针 lr 表示子串的左右边界。
    • r 指针用于扩展窗口,l 指针用于收缩窗口。
  2. 哈希表

    • 使用 uthash 库实现哈希表,记录字符的出现情况。
    • 当遇到重复字符时,通过 HASH_DEL 删除左边界字符,直到移除重复字符。
  3. 字符串长度

    • 使用 strlen(s) 获取字符串的实际长度,而不是 sizeof(s)
  4. 内存管理

    • 在删除哈希表节点时,使用 free 释放动态分配的内存。

2. 不使用 uthash 的实现

代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int lengthOfLongestSubstring(char* s) {int result = 0;int l = 0, r = 0;int cnt[128] = {0}; // ASCII 字符集大小为 128int n = strlen(s); // 获取字符串的实际长度for (r = 0; r < n; r++) {char c = s[r];cnt[c]++; // 增加当前字符的计数if (cnt[c] > 1) { // 如果当前字符重复// 更新最长子串长度result = (r - l > result) ? r - l : result;// 从左边界开始逐个删除字符,直到移除重复字符为止while (cnt[c] > 1) {cnt[s[l]]--; // 减少左端点字符的计数l++; // 缩小窗口}}}// 最后一次更新最长子串长度result = (r - l > result) ? r - l : result;return result; // 返回最长无重复子串的长度
}int main() {char s[100];printf("请输入字符串: ");scanf("%99s", s); // 防止输入溢出int result = lengthOfLongestSubstring(s);printf("无重复字符的最长子串长度为: %d\n", result);return 0;
}
代码说明
  1. 滑动窗口

    • 使用两个指针 lr 表示子串的左右边界。
    • r 指针用于扩展窗口,l 指针用于收缩窗口。
  2. 字符计数数组

    • 使用一个大小为 128 的数组 cnt 记录每个字符的出现次数。
    • 当遇到重复字符时,通过 cnt[s[l]]-- 减少左边界字符的计数,直到移除重复字符。
  3. 字符串长度

    • 使用 strlen(s) 获取字符串的实际长度,而不是 sizeof(s)
  4. 逻辑优化

    • 在每次移动 r 指针时,更新 result
    • 在循环结束后,再次更新 result,以确保覆盖所有情况。

四、sizeof(s) 的错误问题分析:

  • sizeof(s) 返回的是指针的大小(通常是 4 或 8 字节),而不是字符串的实际长度。
  • 应该使用 strlen(s) 获取字符串的实际长度。

五、测试用例

1. 测试用例 1

  • 输入"abcabcbb"
  • 输出3
  • 解释:无重复字符的最长子串是 "abc",长度为 3。

2. 测试用例 2

  • 输入"bbbbb"
  • 输出1
  • 解释:无重复字符的最长子串是 "b",长度为 1。

3. 测试用例 3

  • 输入"pwwkew"
  • 输出3
  • 解释:无重复字符的最长子串是 "wke",长度为 3。

六、总结

通过滑动窗口技术和字符计数数组,我们可以高效地解决“无重复字符的最长子串”问题。以下是关键点总结:

  1. 滑动窗口

    • 使用两个指针 lr 表示子串的左右边界。
    • r 指针用于扩展窗口,l 指针用于收缩窗口。
  2. 字符计数数组

    • 使用一个大小为 128 的数组记录字符的出现次数。
    • 当遇到重复字符时,通过减少左边界字符的计数,直到移除重复字符。
  3. 字符串长度

    • 使用 strlen(s) 获取字符串的实际长度,而不是 sizeof(s)
  4. 逻辑优化

    • 在每次移动 r 指针时,更新最长子串长度。
    • 在循环结束后,再次更新最长子串长度,以确保覆盖所有情况。

七、参考文献

  1. LeetCode:无重复字符的最长子串
  2. C语言标准库<string.h><stdlib.h>
http://www.dtcms.com/wzjs/13358.html

相关文章:

  • 如何做淘宝代购网站设计宁波seo排名优化培训
  • 十度公司做网站怎么样如何制作视频网站
  • iis默认网站怎么设置营销推广方案案例
  • vr模式的网站建设公司企业网站推广效果指标分析
  • 网站建设类文章百度关键词收录排名
  • 南京小程序开发网站建设公司大连中小企业网络营销
  • 西安做网站那家公司好少儿编程
  • wordpress is_home百度关键词优化是什么意思
  • 江苏建设执业资格注册中心官方网站自己的网站怎么在百度上面推广
  • 网站建设服务采购方案模板微信社群营销
  • 上海人才网官网招广州百度推广排名优化
  • 阿里巴巴网站广告怎么做如何推广我的网站
  • 个人网站建站需要准备什么优化公司
  • 网页制作成品网站南宁网络推广软件
  • 手机网站大小关键词推广价格
  • phpcms v9网站建设入门seo分析报告怎么写
  • 万网可以花钱做网站吗个人建网站的详细步骤
  • 用phpmysql做网站百度权重5的网站能卖多少钱
  • 上海电子商务网站开发安徽网站推广
  • 什么是网站前台常用的关键词优化策略有哪些
  • 企业网站找私人做什长春网络推广优化
  • 网站的访问量统计怎么做东莞网络公司网络推广
  • 地方门户网站运营互联网广告营销
  • 开发公司发言稿观摩会第三方关键词优化排名
  • 微信旅游网站建设seo推广是什么意思呢
  • 做家务的男人们在哪个网站播出3步打造seo推广方案
  • 爱办app下载seo教学免费课程霸屏
  • 怎么提高网站的收录量百度域名收录提交入口
  • 政府网站 建设思路seo服务公司怎么收费
  • 贵州省住房和城乡建设厅门户网站聊城疫情最新消息