【算法】【优选算法】字符串

【算法】【优选算法】字符串

目录

一、14.最⻓公共前缀

题目链接:14.最⻓公共前缀
题目描述:

解题思路:

  • 思路一:
    • 我们直接两两求一下公共前缀,记录在ret字符串中,然后ret与后续继续求公共前缀,最后的ret就是结果
    • 求公共前缀,我们就求一下在字符串中的公共前缀的最后一个字符 的下一个下标即可。
  • 思路二:
    • 我们就将第一个字符串作为基准,遍历字符串,每个字符再与字符串数组中剩下的字符串,对应下标的字符比较即可。
    • 当超出某个字符串长度或者字符不同了,就可以返回了。
    • 最后第一个字符串都遍历完了,还没找到,那么第一个字符串就是结果。

解题代码:

思路一: //时间复杂度:O(m*n)//空间复杂度:O(1)classSolution{publicStringlongestCommonPrefix(String[] strs){//两两比较String ret = strs[0];for(int i =1; i < strs.length; i++){ ret =commonPrefix(ret, strs[i]);}return ret;}//返回两个字符串的公共前缀publicStringcommonPrefix(String s1,String s2){int last =0;while(last < s2.length()&& last < s1.length()&& s2.charAt(last)== s1.charAt(last)) last++;return s1.substring(0,last);}} 思路一: //时间复杂度:O(m*n)//空间复杂度:O(1)classSolution{publicStringlongestCommonPrefix(String[] strs){//一起比较for(int i =0; i < strs[0].length(); i++){char ch = strs[0].charAt(i);for(int j =1; j < strs.length; j++){if(i >= strs[j].length()|| ch != strs[j].charAt(i))return strs[0].substring(0,i);}}return strs[0];}}

二、5.最⻓回⽂⼦串

题目链接:5.最⻓回⽂⼦串
题目描述

解题思路:

  • 中⼼扩散:从回⽂串的中⼼开始,往左读和往右读。从中⼼向两边扩展,如果两边的字⺟相同,我们就可以继续扩展;如果不同,我们就停⽌扩展。
  • 我们还需要将回文子串的长度是奇数和偶数都要考虑。

解题代码:

//时间复杂度:O(n^2)//空间复杂度:O(1)classSolution{publicStringlongestPalindrome(String s){String ret ="";for(int i =0; i < s.length(); i++){//奇数长度int left = i;int right = i;while(left >=0&& right < s.length()&& s.charAt(left)== s.charAt(right)){ left--; right++;}if(right - left -1> ret.length()) ret = s.substring(left+1, right);//偶数长度 left = i; right = i+1;while(left >=0&& right < s.length()&& s.charAt(left)== s.charAt(right)){ left--; right++;}if(right - left -1> ret.length()) ret = s.substring(left+1, right);}return ret;}}

三、67.⼆进制求和

题目链接:67.⼆进制求和
题目描述:

题目解析:

简单的竖式加法而已

解题思路:

  • 模拟竖式加法过程,从后向前遍历两个字符串,
  • 定义一个变量,将对应位的相加,和对2取余就是结果对应位的数字,考虑进位就是除以2
  • 当两个字符串都遍历结束,并且变量为0,就得到了结果逆序后的字符串了
  • 最后逆序返回就可以

解题代码:

//时间复杂度:O(n)//空间复杂度:O(1)classSolution{publicStringaddBinary(String a,String b){StringBuffer ret =newStringBuffer();int cruA = a.length()-1;int cruB= b.length()-1;int tmp =0;while(cruA >=0|| cruB >=0|| tmp !=0){if(cruA >=0) tmp += a.charAt(cruA--)-'0';if(cruB >=0) tmp += b.charAt(cruB--)-'0'; ret.append((char)(tmp %2+'0')); tmp /=2;}return ret.reverse().toString();}}

四、43.字符串相乘

题目链接:43.字符串相乘
题目描述:

题目解析:

  • 就相当于每个字符串就是一个数,让我们求乘积,乘积也放在字符串中。

解题思路:

  • 还是使用小学的竖式运算规则,
  • 但是有所不同的是,我们先不进位(就是如果3*8=24,先不进2),在最后的结果中来进位。
  • 我们竖式计算过程是从末尾先开始的,所以我们先将两个字符串逆序。
  • 通过竖式计算过程,每个位计算结果在结果中的下标就是原来两个字符串的下标之和
  • 在进位的时候,我们只需要将每位数字 ,除以10的结果记录在一个变量中,然后这个变量就是进位的数。
  • 现在得到的结果还可能会有前导零:前导零就是指152 * 0 = 000 这就有两个前导零。
  • 由于现在的结果是逆序的,所以从最后开始检验,有就删,注意极端情况全为0的时候,还要保留一位。

解题代码:

//时间复杂度:O(n)//空间复杂度:O(n)classSolution{publicStringmultiply(String num1,String num2){int[] arr =newint[num1.length()+ num2.length()-1];//逆序char[] n1 =newStringBuffer(num1).reverse().toString().toCharArray();char[] n2 =newStringBuffer(num2).reverse().toString().toCharArray();//无进位相乘,相加for(int i =0; i < n1.length; i++){for(int j =0; j < n2.length; j++){ arr[i+j]+=(n1[i]-'0')*(n2[j]-'0');}}// 进位int tmp =0;int cur =0;StringBuffer ret =newStringBuffer();while(cur < arr.length || tmp >0){if(cur < arr.length) tmp += arr[cur++]; ret.append((char)(tmp %10+'0')); tmp /=10;}//处理前导零while(ret.length()>1&& ret.charAt(ret.length()-1)=='0') ret.deleteCharAt(ret.length()-1);return ret.reverse().toString();}}

Read more

【Linux系统】理解管道通信,匿名管道实现进程池+命名管道实现服务端客户端通信模型(附源码)

【Linux系统】理解管道通信,匿名管道实现进程池+命名管道实现服务端客户端通信模型(附源码)

文章目录 * 一、进程间通信是什么 * 二、管道 * 1. 什么是管道 * 2. 匿名管道 * 3. 命名管道 * 三、实例:匿名管道实现进程池 * 四、实例:命名管道实现服务端客户端通信模型 一、进程间通信是什么 进程间通信(IPC),顾名思义,进程之间需要进行信息交换。 如:数据传输、资源共享、通知事件、进程控制。 进程间通信的方式有:管道、System V IPC、POSIX IPC。 由于进程具有独立性,进程间通信的前提就是,不同的进程能看到同一份资源。 二、管道 1. 什么是管道 管道是类Unix系统中最古老的进程间通信的方式。我们把从一个进程连接到另一个进程的数据流称为一个“管道”。 管道是单向通信的,称为单工通信。 管道分为匿名管道和命名管道。 2. 匿名管道

By Ne0inhk
Web Worker:让前端飞起来的隐形引擎

Web Worker:让前端飞起来的隐形引擎

目录 Web Worker:让前端飞起来的隐形引擎 一、什么是 Web Worker? 1、为什么需要 web worker 2、什么是 web worker 二、基本使用方法 1、创建一个 Worker 文件(worker.js) 2、主线程引入并使用 三、实战案例:在前端处理大批量数据 1、Worker 文件(sortWorker.js) 2、主线程调用 四、Vue3 中如何优雅使用 Web Worker 1、新建 Worker 文件(worker.js) 2、在 Vue3

By Ne0inhk
总结前端三年 理想滚烫与现实的冰冷碰撞

总结前端三年 理想滚烫与现实的冰冷碰撞

大家好,我是500佰,技术宅男 目前正在前往独立开发路线,我会在这里分享关于编程技术、独立开发、技术资讯以及编程感悟等内容 6月3日的一篇《一个普通人的30岁 他经历了什么》介绍一篇自己的碎碎念、即回顾自己以前的成长经历,那么再接着说下这3年来的工作经历,2022年1月,我以一名前端新人的身份开始了职业生涯。每当看到浏览器中运行的网站、手机里流畅的APP,或是点击按钮后转动的loading图标,都会想到这些产品背后凝聚着无数开发者的心血。我既期待能成为这个创造数字世界的一员,又难免担心:自己的技术储备是否足够?会不会被身边优秀的同事远远甩在身后? 怀揣着对未来的憧憬与一丝忐忑,我正式踏入了职业生涯的第一站。 不断尝试和调整的前两年(2022 ~ 2024) 我的职业生涯始于一家颇具特色的企业。原本以为会从事移动应用或网站开发,没想到公司专注于打造一款独特产品——我们开发了一系列可复用组件,配合自主研发的拖拽式平台,能够快速搭建Web站点。这种模式与后来流行的低代码平台颇有相似之处。 作为一名Java工程师加入公司后,却发现实际工作内容与预期有较大差异。当时还不了解’前端开发’这个

By Ne0inhk

一个 skill ,增加大模型前端的审美能力

上周,我让 AI 帮我做个落地页。 十分钟过去了,生成出来的东西—— 白色背景,紫色渐变,Inter 字体。 我直接关了。 你也遇到过吧? 用 AI 生前端,出来的东西都长一个样。 背景非白即黑,标题栏永远是紫色渐变,字体不是 Inter 就是 Roboto,配色永远是那套蓝绿红黄。 不是说不能用,但—— 太像 AI 了。 一眼看过去就是"机器生成",没有灵魂,没有个性。 直到昨天,我发现了一个东西。 Anthropic 官方出的一个 skill,叫 frontend-design。 让我再试一次。 这次不一样了 同样的提示词,同样的模型。 我只加了一句话: “使用 frontend-design skill” 结果呢?

By Ne0inhk