昨天晚上,看到一个贴子,标题是"男生洗脚是奔着什么心理去的"。
这条贴子一下子就炸了,119条评论,大家各说各话。
点赞最多的那条挺搞笑,一位iOS开发说:
❝倒是提醒我了。
下面还有评论说:先跳个槽再去。
看得出大家都喜欢玩梗。
紧接着的是美团的一个员工,他说:
❝好赌的爸,生病的妈,上学的弟弟,破碎的她,我是为了拯救她。
这话,明显是在玩那个"经典剧本"的梗。
有人还调侃说:拯救她,就是替gov减少负担,正是爱国的表现。
一位后端开发:
❝拉动消费,促进经济发展。
这挺会找借口的。
还有位前端开发说:
❝你们每天不洗脚就洗脸吗?脚不臭不酸?被子床单不变色?
发帖人还回复说:大家快来看,这里有个老实人。
但真正说到点子上的是这位VP:
❝可能是男人们放松的方式吧。996的牛马们,吃着预制菜、扛着KPI、供着房贷、掉着头发、背着领导甩的锅,身体健康早就出问题了。洗脚比抽烟好,起码对别人无害。
这条评论看得人心里一紧。
确实,程序员这行,天天对着电脑十几个小时,颈椎腰椎都不好。
去按个脚,缓解一下身体疲劳,这事儿挺正常的。
而且,正如这位VP所说,洗脚比抽烟喝酒强多了,起码不伤害别人。
昨天晚上十一点多,我在公司楼下买可乐,我们组那个小李突然拦住我:哥,这道最长回文子串咋写啊,我脑壳疼。
我看了一眼题目,说这题其实挺简单的。
给你一个字符串,找出其中最长的回文子串。
回文就是正着读和反着读都一样的字符串,比如"aba"、"abba"。
这就像你找一个人说话,正着说和反着说意思都一样,这事儿挺难的,但字符串判断就简单多了。
暴力解法就是枚举所有子串,然后判断是不是回文。
但这个复杂度是O(n³),太慢了,原地去世。
优化的思路是中心扩散法。
以每个字符(或每两个字符中间)为中心,向两边扩散,记录最长的回文。
这样复杂度就降到了O(n²)。
还可以进一步优化到O(n),用Manacher算法,但那个理解起来比较费劲。
咱们先写个中心扩散的版本。
package main
import (
"fmt"
)
// longestPalindrome 找出最长的回文子串
func longestPalindrome(s string) string {
iflen(s) < 2 {
return s
}
start, end := 0, 0
for i := 0; i < len(s); i++ {
// 奇数长度,以当前字符为中心
len1 := expandAroundCenter(s, i, i)
// 偶数长度,以当前字符和下一个字符之间为中心
len2 := expandAroundCenter(s, i, i+1)
maxLen := max(len1, len2)
if maxLen > end-start {
start = i - (maxLen-1)/2
end = i + maxLen/2
}
}
return s[start : end+1]
}
// expandAroundCenter 从中心向两边扩散,返回回文长度
func expandAroundCenter(s string, left, right int) int {
for left >= 0 && right < len(s) && s[left] == s[right] {
left--
right++
}
return right - left - 1
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
// 测试用例
fmt.Println(longestPalindrome("babad")) // bab 或 aba
fmt.Println(longestPalindrome("cbbd")) // bb
fmt.Println(longestPalindrome("a")) // a
fmt.Println(longestPalindrome("ac")) // a 或 c
}
