探索通义灵码在算法生成中的无限潜力——字符串篇

简介: 书接上文(https://developer.aliyun.com/article/1367211?spm=a2c6h.24874632.expert-profile.15.1c8e3273BSVyTf),由于算法的分类较多且实现语言不唯一,故此处想单独另开一文来进行测试。

前言

实测通义灵码:解锁智能编程的钥匙:https://developer.aliyun.com/article/1367211?spm=a2c6h.13148508.setting.15.5f074f0etrEHdr

探索通义灵码在算法生成中的无限潜力——数组篇:https://developer.aliyun.com/article/1367500?spm=a2c6h.13148508.setting.14.5f074f0etrEHdr

字符串篇

字符串是由零个或多个字符组成的有限序列。一般记为image.png。它是编程语言中表示文本的数据类型。

字符串与数组有很多相似之处,比如使用 名称[下标] 来得到一个字符。然而,字符串有其鲜明的特点,即结构相对简单,但规模可能是庞大的。

以生物中的 DNA 序列为例,假设一个 DNA 序列为image.png,在人体中,该序列的长度可能会达到 n × 10^8

然而,构成序列的基本碱基种类只有image.png4 种。

image.png

这里我们可将image.png作一个字符集,由字符集中的一些字符组合而成的 DNA 序列可以看作一个字符串。

在编程语言中,字符串往往由特定字符集内有限的字符组合而成,根据其特点,对字符串的 操作 可以归结为以下几类:

  1. 字符串的比较、连接操作(不同编程语言实现方式有所不同);

  2. 涉及子串的操作,比如前缀,后缀等;

  3. 字符串间的匹配操作,如 KMP 算法、BM 算法等。

反转字符串

image.png



给出提问如下:

编写一个函数,其作用是将输入的字符串反转过来。根据以下代码完成:
class Solution:
def reverseString(self, s: List[str]) -> None:

生成代码如下:

image.png

给出代码及对照结果, 正确

image.png

整数反转

image.png



给出提问如下:

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
根据以下代码完成:class Solution:
def reverse(self, x: int) -> int:

生成代码如下:

image.png

给出代码及对照结果, 正确

image.png

字符串中的第一个唯一字符

image.png



给出提问如下:

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1。根据以下代码完成:
class Solution:
def firstUniqChar(self, s: str) -> int:

生成代码如下:

image.png

给出代码及对照结果, 正确

image.png

有效的字母异位词

image.png



给出提问如下:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。根据以下代码完成:
class Solution:
def isAnagram(self, s: str, t: str) -> bool:

生成代码如下:

image.png

给出代码及对照结果, 正确

image.png

验证回文串

image.png



给出提问如下:

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
根据以下代码完成:class Solution:
def isPalindrome(self, s: str) -> bool:

生成代码如下:

image.png

给出代码及对照结果, 正确

image.png

字符串转换整数 (atoi)

image.png



给出提问如下:

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
根据以下代码完成:class Solution:
def myAtoi(self, s: str) -> int:

生成代码如下:

image.png

给出代码及对照结果, 正确

image.png

实现 strStr()

image.png



给出提问如下:

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
根据以下代码完成:class Solution:
def strStr(self, haystack: str, needle: str) -> int:

生成代码如下:

image.png

给出代码及对照结果, 正确

image.png

外观数列

image.png



给出提问如下:

给定一个正整数 n ,输出外观数列的第 n 项。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
你可以将其视作是由递归公式定义的数字字符串序列:
countAndSay(1) = "1"
countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
前五项如下:
1
11
21
1211
111221
第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。
根据以下代码完成:class Solution:
def countAndSay(self, n: int) -> str:

对于此类题设较为复杂的题,不出所料,未通过实例测试。

image.png

此时开始判断是大模型的哪种错误情况,我提问如下:

image.png

此时,它并未意识到自己生成的代码逻辑下当输入n = 4时,输出为" ",所以此处为代码逻辑幻觉

image.png

再次进行测试,给出代码及对照结果, 正确

image.png

最长公共前缀

image.png



给出提问如下:

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。根据以下代码完成class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:

生成代码如下:

image.png

给出代码及对照结果, 正确

image.png

结论

通义灵码对于基础字符串的处理已经臻至化境了,对于普通的字符串算法题能够准确的理解其含义,并能快速生成符合题意的算法,而且时间、空间复杂度,内存占用都比较可观。

  • 能够从题目描述中提取关键信息,并将其转化为可操作的指令和数据结构,使得生成的算法更加贴合题目要求。

  • 通过模式匹配和知识推理的方法,结合已有的算法模板和优化技巧,生成高效且正确的代码。

  • 能够根据题目给出的限制条件,分析和评估不同算法的时间复杂度和空间复杂度,选择最优的解决方案。同时,通义灵码还能针对具体算法进行进一步的优化,以提高算法的执行效率和内存利用率。


题目 最初答案 最终答案 执行用时 内存消耗
反转字符串 超过87.64% 超过82.28%
整数反转 超过70.72% 超过99.30%
字符串中的第一个唯一字符 超过5.08% 超过82.46%
有效的字母异位词 超过72.34% 超过40.70%
验证回文串 超过63.98% 超过49.00%
字符串转换整数 (atoi) 超过9.12% 超过55.25%
实现 strStr() 超过58.89% 超过65.17%
外观数列 × 超过42.74% 超过98.10%
最长公共前缀 超过68.71% 超过80.78%

【注意】最初答案指第一次生成的答案是否正确;最终答案指多次调教之后生成的答案是否正确;执行用时越,超过的比例就越多;内存消耗越,超过的比例就越多。

相关文章
|
1月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
1月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
2月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
240 1
|
2月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
1月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
52 0
|
2月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
3月前
|
存储 算法 Cloud Native
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
|
3月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
3月前
|
存储 算法 Java
Java数据结构与算法:用于高效地存储和检索字符串数据集
Java数据结构与算法:用于高效地存储和检索字符串数据集
|
3月前
|
算法 Java
Java数据结构与算法:字符串匹配算法之暴力匹配
Java数据结构与算法:字符串匹配算法之暴力匹配