2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组 wordsContainer 和 wordsQuery,要对每个 wordsQuery[i] 找到一个与其有最长公共后缀的字符串

news/2025/3/15 21:02:20/文章来源:https://www.cnblogs.com/moonfdd/p/18504365

2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组 wordsContainer 和 wordsQuery,要对每个 wordsQuery[i] 找到一个与其有最长公共后缀的字符串。如果有多个字符串与 wordsQuery[i] 有相同的最长公共后缀,则返回在 wordsContainer 中最早出现的那个。最后,返回一个整数数组 ans,其中 ans[i] 表示与 wordsQuery[i] 有最长公共后缀的字符串在 wordsContainer 中的下标。

输入:wordsContainer = ["abcd","bcd","xbcd"], wordsQuery = ["cd","bcd","xyz"]。

输出:[1,1,1]。

解释:

我们分别来看每一个 wordsQuery[i] :

对于 wordsQuery[0] = "cd" ,wordsContainer 中有最长公共后缀 "cd" 的字符串下标分别为 0 ,1 和 2 。这些字符串中,答案是下标为 1 的字符串,因为它的长度为 3 ,是最短的字符串。

对于 wordsQuery[1] = "bcd" ,wordsContainer 中有最长公共后缀 "bcd" 的字符串下标分别为 0 ,1 和 2 。这些字符串中,答案是下标为 1 的字符串,因为它的长度为 3 ,是最短的字符串。

对于 wordsQuery[2] = "xyz" ,wordsContainer 中没有字符串跟它有公共后缀,所以最长公共后缀为 "" ,下标为 0 ,1 和 2 的字符串都得到这一公共后缀。这些字符串中, 答案是下标为 1 的字符串,因为它的长度为 3 ,是最短的字符串。

答案2024-10-26:

chatgpt

题目来自leetcode3093。

大体步骤如下:

1.初始化数据结构

  • 创建一个结果数组 ans,其长度与 wordsQuery 相同,用于存放每个查询的结果索引。

  • 在遍历 wordsContainer 时记录每个字符串的索引和长度,便于后续比较。

2.处理每一个查询字符串

  • 遍历 wordsQuery 中的每个字符串,比如 wordsQuery[i]

  • 对于每个查询字符串,初始化当前最长公共后缀的长度 (maxLen) 为0,和对应的字符串索引 (bestIndex)。

3.与每一个容器字符串比较

  • 对于每个查询字符串,遍历 wordsContainer 中的所有字符串。

  • 从当前查询字符串的尾部开始向前检查与当前 wordsContainer[j] 的后缀匹配。

  • 计算两个字符串,从尾部开始的最大匹配长度。

  • 若发现新的公共后缀长度大于 maxLen,则更新 maxLenbestIndex 为当前字符串的索引。

  • 如果发现公共后缀长度等于当前的 maxLen,则比较 wordsContainer[j]wordsContainer[bestIndex] 的长度:

    • 如果 wordsContainer[j] 更短,则更新 bestIndex

4.处理没有匹配的情况

  • 如果没有匹配,则 maxLen 将保持为0,bestIndex 将在初始状态。

  • 根据预定规则,将 bestIndex 更新为 1,表示第一个有效字符串的索引。

5.填充结果数组

  • 将确定的 bestIndex 存入结果数组 ans[i]

6.完成遍历

  • 重复步骤2到步骤5,直到遍历完所有的 wordsQuery

7.返回结果

  • 返回填充完整的结果数组 ans

复杂度分析

1.时间复杂度

  • 对于每个查询字符串(假设有 m 个查询),我们需要遍历每个容器字符串(假设有 n 个字符串)。

  • 每次比较可能最多需要遍历两个字符串的长度(设最坏情况,两个字符串长度均近似于 L),因此时间复杂度为:O(mnL)

  • 这里的 O(n \times L) 是对每个查询遍历所有容器字符串的时间。

2.空间复杂度

  • 由于只使用了一个结果数组 ans,其大小为 m,额外的不常数空间基本上是常量级别。

  • 因此,总的额外空间复杂度为:(O(m))

  • 不考虑输入数组本身占用的空间。

总结

  • 时间复杂度: O(mnL)

  • 空间复杂度: (O(m))

这个分析为你构建解决方案提供了清晰的逻辑框架,并明确了复杂度考量。

Go完整代码如下:

package mainimport ("fmt""math"
)func stringIndices(wordsContainer, wordsQuery []string) []int {type node struct {son     [26]*nodeminL, i int}root := &node{minL: math.MaxInt}for idx, s := range wordsContainer {l := len(s)cur := rootif l < cur.minL {cur.minL, cur.i = l, idx}for i := len(s) - 1; i >= 0; i-- {b := s[i] - 'a'if cur.son[b] == nil {cur.son[b] = &node{minL: math.MaxInt}}cur = cur.son[b]if l < cur.minL {cur.minL, cur.i = l, idx}}}ans := make([]int, len(wordsQuery))for idx, s := range wordsQuery {cur := rootfor i := len(s) - 1; i >= 0 && cur.son[s[i]-'a'] != nil; i-- {cur = cur.son[s[i]-'a']}ans[idx] = cur.i}return ans
}func main() {wordsContainer := []string{"abcd", "bcd", "xbcd"}wordsQuery := []string{"cd", "bcd", "xyz"}fmt.Println(stringIndices(wordsContainer, wordsQuery))
}

在这里插入图片描述

Rust完整代码如下:

use std::cmp::Ordering;struct Node {son: [Option<Box<Node>>; 26],min_l: usize,index: usize,
}impl Node {fn new() -> Self {Node {son: Default::default(),min_l: usize::MAX,index: usize::MAX,}}
}fn string_indices(words_container: Vec<&str>, words_query: Vec<&str>) -> Vec<usize> {let mut root = Node::new();for (idx, s) in words_container.iter().enumerate() {let l = s.len();let mut cur = &mut root;if l < cur.min_l {cur.min_l = l;cur.index = idx;}for ch in s.chars().rev() {let b = (ch as usize) - ('a' as usize);if cur.son[b].is_none() {cur.son[b] = Some(Box::new(Node::new()));}cur = cur.son[b].as_mut().unwrap();if l < cur.min_l {cur.min_l = l;cur.index = idx;}}}let mut ans = vec![0; words_query.len()];for (idx, s) in words_query.iter().enumerate() {let mut cur = &mut root;for ch in s.chars().rev() {let b = (ch as usize) - ('a' as usize);if cur.son[b].is_none() {break;}cur = cur.son[b].as_mut().unwrap();}ans[idx] = cur.index;}ans
}fn main() {let words_container = vec!["abcd", "bcd", "xbcd"];let words_query = vec!["cd", "bcd", "xyz"];let result = string_indices(words_container, words_query);println!("{:?}", result);
}

在这里插入图片描述

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

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

相关文章

PTA第1~3次大作业分析及总结

一、前言 经过数周的努力,第三次大作业也落下了帷幕,这三次大作业从第一次到第三次难度逐渐递增,需求不断地增加,对于初学JAVA的我无疑是一个巨大的考验。 第一次大作业,主要侧重类的简单设计,老师在最后一题给出了类的参考设计,算是对我们java的一个入门考验,既是考验…

使用spi-gpio-custom模块配置SPI总线

使用spi-gpio-custom模块配置SPI总线来源 https://www.xuzhe.tj.cn/index.php/2023/10/26/spi-gpio-customspi/ 参考专栏 https://www.zhihu.com/column/c_16980846677677096961. 引言 SPI(Serial Peripheral Interface)是一种常见的串行通信协议,广泛应用于微控制器与外部设…

开源化验单智能识别:思通数科AI平台引领医疗数据处理新变革

智能化验单识别系统在医疗数据管理中的应用意义体现在多个方面,包括提高数据录入效率、减少人为错误、优化患者体验,以及为医疗研究提供高质量数据支持。以下是智能化验单识别系统在医疗数据高效管理中的主要应用意义:提升数据录入效率,减轻医护人员负担传统的化验单录入多…

关于栈

关于栈栈的图一.什么是堆栈平衡(比较抽象)含义就是 当函数在一步步执行的时候 一直到ret执行之前,堆栈栈顶的地址 一定要是call指令的下一个地址。 也就是说函数执行前一直到函数执行结束,函数里面的堆栈是要保持不变的。 如果堆栈变化了,那么,要在ret执行前将堆栈恢复成原…

简单谈谈Google TPUv6

简单谈谈Google TPUv6 根据Google TPU第六代的数据做了一些性能数据的对比,需要注意的是TPUv6当前应该是一个用于训推一体的单Die的版本,用于训练的V6p双Die版本应该会后期再发布. 需要注意的是在国内外都开始卷大模型推理价格的时候, TPU这样的东西对于提高ROI非常有帮助。快…

GNU编译器(GCC)原理简介

GNU编译器(GCC)原理简介GNU编译器(GCC, GNU Compiler Collection)是GNU工具链的关键组件,与GNU、Linux相关项目的标准编译器。它设计之初仅用来处理C语言的(也被称为GNU C编译器),紧接着扩展到C++、Objective-C/C++、Fortran、Java、Go等编程语言。 目前,GCC已经被以知…

22207130-叶盛东-Java大作业总结

Java大作业总结 目录Java大作业总结一.前言第一次作业1.设计与分析第一小题第二小题第三小题第四小题第五小题2.踩坑心得3.改进建议第二次作业1.设计与分析第一小题第二小题第三小题第四小题2.踩坑心得3.改进建议第三次作业1.设计与分析第一小题第二小题第三小题2.踩坑心得3.改…

基于ESP32的桌面小屏幕实战[1]:需求分析与方案选型

项目来源:B站小智学长 1. 需求分析看时间:可联网同步时间;有屏幕 看天气:可联网同步天气;有屏幕 记单词:可联网同步单词;有屏幕 番茄工作时钟:可以手机设置工作、休息时间;有屏幕 获取B站粉丝数: 看室内温湿度:有温湿度传感器;有屏幕 可放入口袋:1-2寸屏幕;带电池…

利用samtools flagstat 对bam文件统计比对率的时候看的是哪个mapping rate

001、 在samtools flagstat 对bam的统计结果中,一共有三个比对率的结果: 002、比对率结果应该以哪个为准? 答案是:以3为准003、以山羊、绵羊的fastq数据,绵羊的参考基因组进行比对测试 a、如果以primary mapped对比,基本看不出两者的差异(其中S是sheep,G是goat) b、…

CPU 计算时延分析

CPU 计算时延 CPU(中央处理器)是计算机的核心组件,其性能对计算机系统的整体性能有着重要影响。CPU 计算时延是指从指令发出到完成整个指令操作所需的时间。理解 CPU 的计算时延对于优化计算性能和设计高效的计算系统至关重要。 1. CPU 计算时延的组成 CPU 计算时延主要由以…

Windows 记录一次磁盘相关的PC卡顿问题

我的电脑最近经常抽疯,时不时卡顿一次 检查系统事件日志,会有这俩个:发出了对设备 \Device\RaidPort0 的重置。 已在磁盘 0 (PDO 名称: \Device\0000003a)的逻辑块地址 0x7206a8 处重试 IO 操作。DiskGenis检查磁盘0,是正常的:这个FASPEED硬盘是国产士必得牌子的。京东商城…