楔子
大家好,我是张桃狮。
最近,我发现同事和客户使用WPS做表格的越来越多。
而我一直以来都习惯用Excel。
这本来没什么,因为Excel和WPS的表格格式一直都可以互相兼容。
可是有一些使用了WPS嵌入单元格图片的表格,我用Excel打开是无法看到图片的。
只能看到一些类似乱码的东东。
以前我都是在电脑上额外安装一套WPS,遇到Excel看不到图片的表格,就用WPS打开。
可是我发现WPS经常会偷偷更改我电脑上的文件打开方式,还会开机启动,拖慢电脑的速度。
对于我这种老爷机,实在是不堪其扰,就忍痛把WPS卸载了。
那么不安装WPS,如何用Excel查看WPS嵌入单元格图片呢?
我想到一个变通的方法。
前提是我有一些非常喜欢用WPS表格的同事,他们经常会给我发一些WPS在线共享表格链接。
我在浏览器中随便打开一个这种WPS在线表格,点击右下角加号-导入-导入文件数据-从本地文件,打开需要转换的表格文件。
我发现这些嵌入单元格图片在浏览器中是可以正常展示的。
将所有嵌入单元格图片选中-右键-转为浮动图片。
点左上角菜单按钮-下载,保存到本地,再用Excel打开就可以看到图片了。
最后说一下,我多么希望Excel和WPS可以一直互相兼容下去,可惜不现实。
咱们闲话讲完,继续力扣刷题吧。
力扣205. 同构字符串
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
提示:
1 <= s.length <= 5 *
t.length == s.length
s 和 t 由任意有效的 ASCII 字符组成
我的思路
这道题让我想起了图灵的炸弹机。
可惜我不是图灵那样的天才,只会用最笨的方法。
首先判断两个字符串长度是否相等,如果不相等直接返回False。
可以利用字符串中重复的字符来判断两个字符串是否同构。
如果在一个字符串中有重复的字符,那么在另外一个字符串中相同位置的字符也应该是相同的。
这个过程要走两遍,分别是从s到t,和从t到s。
代码如下。
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
if len(s)!=len(t):
return False
for i in range(len(s)):
for c in s[i+1:]:
if s[i]==c:
j=s[i+1:].index(c)+i+1
if t[i]!=t[j]:
return False
for i in range(len(t)):
for c in t[i+1:]:
if t[i]==c:
j=t[i+1:].index(c)+i+1
if s[i]!=s[j]:
return False
return True
可以通过三个测试用例,可惜提交后超时了。
估计是因为时间复杂度达到O(),得想办法把时间复杂度降下来。
我打算用哈希表,将两个字符串用集合去重的同时,将两个字符串相同位置的字符连接在一起用字典去重。
最后比较一下去重后的长度,都相同就返回True。
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
if len(s)!=len(t):
return False
s_set,t_set=set(),set()
st_dict=dict()
for i in range(len(s)):
s_set.add(s[i])
t_set.add(t[i])
st_dict[s[i]+t[i]]=i
if len(s_set)==len(t_set)==len(st_dict):
return True
else:
return False
力扣提交通过,时间复杂度O(n),空间复杂度O(1)。
字符集为 ASCII(最多 256 个不同字符),三个集合的存储容量不会超过 256,与输入字符串的长度无关,所以空间复杂度是O(1)。
力扣官方题解
没有python版本的答案,我让豆包将官方题解的C++代码转为python。
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
# 定义两个双向映射字典,s2t: s的字符映射到t的字符,t2s: t的字符映射到s的字符
s2t = dict()
t2s = dict()
# 遍历两个字符串的每个字符对(zip自动按最短长度匹配,题目保证s/t长度相同)
for x, y in zip(s, t):
# 核心判断:若x已映射但目标不是y,或y已映射但目标不是x,说明不同构
if (x in s2t and s2t[x] != y) or (y in t2s and t2s[y] != x):
return False
# 建立/更新双向映射
s2t[x] = y
t2s[y] = x
# 所有字符匹配完成,说明是同构字符串
return True
力扣提交通过,时间复杂度O(n),空间复杂度O(1)。
zip() 是 Python 内置的可迭代对象打包函数,核心作用是将多个可迭代对象(列表、字符串、元组等) 按位置一一配对,返回一个zip 迭代器,迭代器中的每个元素是由各可迭代对象对应位置元素组成的元组,是遍历多组关联数据的高效方式。
分享几个网友的代码
来自Jam
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
return all(s.index(s[i]) == t.index(t[i]) for i in range(len(s)))
力扣提交通过,时间复杂度O(),空间复杂度O(1)。
代码频繁使用index判断字符在字符串中第一次出现的位置,str.index()是线性查找,单次时间复杂度O(n),跟外层循环的时间复杂度O(n)相乘,就变成了O()。
来自skirk
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
return len(set(zip(s, t))) == len(set(s)) == len(set(t))
力扣提交通过,时间复杂度O(n),空间复杂度O(1)。
这个代码的思路跟我的方法二一模一样,但是只用一行就完成了。
python处理字符串还是很无敌的。
我是个编程爱好者,小白级别的,如果你跟我一样希望通过力扣刷题,学习各种奇妙的算法,可以关注我,大家一起学习。