首页 > 其他分享 >14. 最长公共前缀

14. 最长公共前缀

时间:2024-04-23 22:58:40浏览次数:21  
标签:return 14 int 前缀 ++ strs 最长 string size

题目链接:

实现一、\(\rm Trie\)

多串的最长公共前缀,首先想到 \(\rm Trie\)。

class Solution {
public:
    static const int N = 210;
    int ch[N][26], idx, cnt[N];
    void insert(string s) {
        int p = 0;
        for (int i = 0; i < s.size(); i++) {
            int j = s[i] - 'a';
            if (!ch[p][j]) ch[p][j] = ++idx;
            p = ch[p][j];
            cnt[p]++;//这个细节特别重要,一会儿会讲到(有一点存疑)
        }
    }
    int query(string s) {
        int p = 0;
        for (int i = 0; i < s.size(); i++) {
            int j = s[i] - 'a';
            if (!ch[p][j]) return 0;
            p = ch[p][j];
        }
        return cnt[p];
    }
    string longestCommonPrefix(vector<string>& strs) {
        int n = strs.size();
        for (auto i : strs) insert(i);
        string t, s = strs[0], ans;
        for (auto i : s) {
            t += i;//必须一开始就写,不能在if(query)之后再写
            if (query(t) == n) {
                if (t.size() > ans.size()) ans = t;
            }
        }
        return ans;
    }
};

如果 t += i 写在 \(\rm if(query)\) 之后的话,当输入 vector< string >& strs 为 "a" 的时候正确输出应为 "a",但该程序输出空串。

至于上面的那个 \(\rm cnt[p]\)++ 应放置的正确位置还有待商榷,等把力扣有关 \(\rm Trie\) 的所有题目刷完之后回来补。

实现二、横向扫描

class Solution {
public:
    string check(string a, string b) {
		int n = a.size(), m = b.size();
		string t;
		if (a == "" || b == "") return t;
		if (a[0] != b[0]) return t;
		else {
			for (int i = 0; i < min(m, n); i++) {
				if (a[i] == b[i]) {
					t += a[i];
				}
				else break;
			}
			return t;
		}
		return t;
	}
	string longestCommonPrefix(vector<string>& strs) {
		string r = strs[0];
		for (int i = 1; i < strs.size(); i++) {
			r = check(r, strs[i]);
		}
		return r;
	}
};

实现三、纵向扫描

从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。

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

实现四、思维法

按照字典序排序后,直接比较第一个和最后一个

class Solution {
public:
    string longestCommonPrefix(vector<string> &str) {
        sort(str.begin(), str.end());
        string &s1 = str.front();
        string &s2 = str.back();
        int size = min(s1.size(), s2.size());
        int i;
        for (i = 0; i < size; i++) {
            if (s1[i] != s2[i]) break;
        }
        return {s1.begin(), s1.begin() + i};
    }
};

标签:return,14,int,前缀,++,strs,最长,string,size
From: https://www.cnblogs.com/pangyou3s/p/18153986

相关文章

  • AGC014D Black and White Trees
    传送门[AGC014D]BlackandWhiteTree给出一颗\(N\)个节点组成的树,每个节点都可以被染成白色或者黑色;有高桥(先手)和青木(后手)两个人————高桥可以把任意一个点染成白色,青木则可以把任意一个点染成黑色,每个点只可染色一次。重复上述操作直到所有点都被染色后,只执行一次执行......
  • 前缀索引
    前缀索引·MySQL优化·看云https://www.kancloud.cn/lizhenjie1992/my/554979通过字段前n位创建的索引就称为“前缀索引”。如果一个字段内容的前边的n位信息已经足够标识当前的字段内容,就可以把字段的前n位获得出来并创建索引,该索引占据空间更小、运行速度更快.例如:关伟......
  • 14.常用模块(一)
    【一】time模块时间戳元组(struct_time)格式化的时间字符串importtime1)时间转换1.生成时间戳importtimetime_str=time.time()print(time_str,type(time_str))#1713506730.3318834<class'float'>2.时间戳转换成时间元组importtime#国际时间time_tuple......
  • stm32串口晶振不对输出乱码+汇承HC-14lora模块
    最近要用到一个lora无线透传模块,然后就先用两个32开发板(用的STM32F103C8T6)试试简单的收发数据。结果,第一步串口发送一句话就寄了,我串口打印了“hi”,结果出现了一堆乱码,我寻思着,就这一句代码也不至于还能错吧。。。然后我以为是USB-TTL的问题,换了一个能用的还是一样。。。但是很奇......
  • 《自动机理论、语言和计算导论》阅读笔记:p261-p314
    《自动机理论、语言和计算导论》学习第10天,p261-p314总结,总计48页。一、技术总结1.generating&reachable2.ChomskyNormalForm(CNF)乔姆斯基范式。3.pumpinglemma泵作用引理。引理:引理是数学中为了取得某个更好的结论而作为步骤的已证明命题,其意义并不在于自身已完......
  • Groovy Document 4.0.14
    目录下载安装与Java的区别默认的imports多方法或者叫运行时分发数组初始化包可见性自动资源管理内部类lambda表达式和方法引用操作符GStringsString和字符字面量==的行为原生类型与包装类型使用@CompileStatic原生数据类型优化正负零的边界情况约定其他的关键字官方文档:https://......
  • 6K价位整机不二之选!AMD锐龙7 8700F评测:游戏、AI全方位战胜i5-14400F
    一、前言:主打OEM市场的处理器在消费级市场上,无论是桌面零售端,还是移动笔记本端,AMD锐龙处理器的人气都大大盖过了Intel酷睿,产品日渐丰盛,销量也如同坐火箭一般。不过在台式整机市场,尤其是电商整机领域,Intel以酷睿i5-13400/14400F为代表的处理器的优势非常明显,几乎一直都是垄断状态......
  • JTCR-模块-14
    JDK9引入了模块,用于描述代码之间的关系和依赖,控制某模块是否可以被其他模块访问。模块基础一个模块由一组包和资源组成。模块定义在名为module-info.java的文件中,javac将这个文件编译成类文件,称为moduledescriptor。该文件仅能包含一个模块定义。模块定义的一般形式为://......
  • Vinka超低功耗抗干扰LCD液晶段码屏驱动芯片 推出新封装:VKL144C/D LQFP48/SSOP48
    VKL144C/D概述:VKL144C/D是一个点阵式存储映射的LCD驱动器,可支持最大144点(36SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。特点•工......
  • CAE实证Vol.14:超大内存机器,让你的HFSS电磁仿真解放天性
     HFSS(HighFrequencyStructureSimulator)是世界上第一款商业化的3D电磁仿真软件。由Ansoft公司在1990年开发并发布第一个版本。2008年,Ansys收购了Ansoft,继续开发HFSS等电子与电磁仿真产品,目标是解决整个工业体系中机械与电气领域的持续融合问题。现在的HFSS,已经成为天线、......