Day.1 LeetCode刷题练习(最长公共前缀 C/C++两种解法)

题目:

例子:

分析题目:

主要目的:求出各个字符串的公共前缀

思路(本人解法):

用所给实例来看,不难看出我们可以直接以竖着对应来查看是否是公共前缀 , 

这样就有了一定的思路 , 然后接着想如何让他找到最长的公共前缀后就 停止下来呢 

这样就能想到,从最短的字符串下手(因为公共前缀最长就只能是最短的字符串或者是最长字符串的前几个)

这样就有了大概的轮廓:

  1. 找到最短字符串(记录其长度)
  2. 通过比较的方法依次竖向比较,然后遍历(每个字符串和每个对应的前缀),找到公共前缀的最后(也就是不同/len的时候就能退出了)竖向比较:

 

Cyy:

char * longestCommonPrefix(char ** strs, int strsSize){int i = 0;int j = 0;
//找到最短的字符串以及记录其最短的长度int len = strlen(strs[0]);for(int i = 1 ; i < strsSize ; i++){if(strlen(strs[i]) < len){len = strlen(strs[i]);}}
//竖向比较
//从下标为0处开始,到最短字符串的最后一个字符(len-1)for(i = 0; i < len ;i++){for(j = 1; j < strsSize;j++)//比较每个字符串的下标i处的字符是否相等(此时进行竖向比较){if(strs[j][i] != strs[j-1][i])//当有不同的时候就退出break;}if(j != strsSize)//到此处有两种可能,一是有不同中途退出的,二是全部相同后自然退出的break;//当不是自然退出的时候 j != strSize 、 此时就表示已经找到公共前缀的最后一个那就退出循环}strs[0][i] = '\0';//直接把下标i处换成\0,这里利用了字符串以\0结尾的特性return strs[0];
}

通过查看官方给的答案后进一步优化:

此时我们还能不再判断最短的字符串

而是直接在内部来查看,当竖向查找到了其中一个字符串的最后一个元素时就退出循环

char * longestCommonPrefix(char ** strs, int strsSize){int i = 0;int j = 0;int len = strlen(strs[0]);for(i = 0; i < len ;i++){for(j = 1; j < strsSize;j++){if(strs[j][i] != strs[j-1][i] || strlen(strs[j]) == i)//此处进行了优化break;}if(j != strsSize)break;}strs[0][i] = '\0';return strs[0];
}

C++:

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {int number = strs.size();int len = strs[0].size();for(int i = 0; i < len;i++){int j;for(j = 1 ; j < number;j++){if(strs[j][i] != strs[0][i] || strs[j].size() == i)break;}if(j != number)return strs[0].substr(0,i);}return strs[0];}
};

总结学到什么:

  • 模拟法(模拟题目所给步骤来解决问题)
  • 用些地方可以进行优化
    • 优化后不用再查找最小字符串(因为后面有需要遍历的字符串所以可以再后面再进行 与i的进行判断看是否到某些字符串的结尾了)
  • 字符串以\0结尾可以把一个字符串的某个位置改成\0这样就修改了结尾

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8092.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python爬虫与数据分析】文件读写

目录 一、概述 二、txt文件读写 三、csv文件读写 四、Json文件读写 一、概述 读写模式&#xff1a; r&#xff1a;读数据w&#xff1a;覆盖写入a&#xff1a;追加写入rb&#xff1a;以二进制形式读出wb&#xff1a;以二进制形式写入ab&#xff1a;以二进制形式追加r、w、…

TypeScript 总结

文章目录 TypeScript 总结概述运行ts文件方式一方式二 基础声明变量类型数组元组联合类型取值限制 枚举类型any & unknownvoid & undefined类型适配 面向对象函数普通函数箭头函数可选参数默认参数 对象创建对象对象的类型限制 类和接口泛型简单使用多个泛型默认泛型类…

C语言经典案例-2

今天继续给大家分享C语言学习的经典练手案例 记录在校学习第三天&#xff0c;继续加油 今日案例来源&#xff1a;csdn社区每日一练 1.商品优惠计算机 商品优惠计算器 使用if语句编程实现输入购货金额&#xff0c;输出实际付款金额。购货折扣率如下&#xff1a; 购货金额≤500元…

obs录制功能源码分析

录制按钮 界面文件&#xff1a; 主界面:OBSBasic.ui 中开始录制按钮的objectName 是 recordButton 槽函数&#xff1a; void OBSBasic::on_recordButton_clicked() {//1 输出模式是否被激活if (outputHandler->RecordingActive()) {bool confirm config_get_bool(GetGlo…

LiDAR SLAM 闭环——BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM

先说总结 现算法已经开源&#xff0c;代码链接&#xff1a; GitHub - YungeCui/BoW3D: [RA-L] BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM. 背景 SLAM&#xff08;同时定位与地图构建&#xff09;是一种让机器人在构建环境地图的同时&#xff0c;定位…

Spring整合Junit单元测试

1.Spring整合Junit单元测试 1.1 原始Junit测试Spring的问题 在测试类中&#xff0c;每个测试方法都有以下两行代码&#xff1a; ApplicationContext ac new ClassPathXmlApplicationContext("application.xml");BookDao bookDao (BookDao)ac.getBean("bookDa…

Angular 调试 —— 一个真实的多重循环导致的Bug

导致性能问题的原因可能很复杂&#xff0c;也可能很简单&#xff0c;今天让我们来看一个现实的例子。一个多重循环导致列表卡死。 startDemo() {this.processing true// 创建复杂数据结构const data [];for (let i 0; i < 5000; i) {const innerArray [];for (let j …

(小程序)uniapp调接口完整流程

(小程序)uniapp调接口完整流程 代码&#xff1a; <script lang"ts" setup>import { ref } from "vue"; const form ref({searchVal: "", });//搜索const searchClick () > {console.log(form.value.searchVal)let data {text: form…

git merge 和git rebase的区别

文章目录 1. 概念2. git merge2.1. 示例 3. git rebase3.1. 示例 4. 总结 1. 概念 在Git版本控制系统中&#xff0c;有两种方式可以将一个分支的更改合并到另一个分支&#xff1a;git merge 和 git rebase。虽然它们都可以完成相同的任务&#xff0c;但它们的实现方式有所不同…

软考:中级软件设计师:计算机存储结构,cache,局部性原理,RAM和ROM,磁盘结构和计算

软考&#xff1a;中级软件设计师:计算机存储结构 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的…

用git下载gitee上的项目资源

目录 用git下载gitee上的项目资源 用git 的clone 命令 然后到gitee上复制相关的下载地址&#xff1a; 粘贴到clone后面即可&#xff08;注意地址与clone之间有空格&#xff01;&#xff01;&#xff01;&#xff09; 运行结果&#xff1a; 用git下载gitee上的项目资源 用git…

软件设计模式与体系结构-设计模式-行为型软件设计模式-迭代器模式

行为型软件设计模式 概述 行为型设计模式是软件设计模式中的一类&#xff0c;用于处理对象之间的交互和通信。这些模式关注的是对象之间的行为和职责分配。以下是几种常见的行为型设计模式&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;&#xff1a;定义了…