前言
抽象去个性留共性,是因为具体个性对于解决问题是个累赘。少了累赘,直击需求,才能进行问题转换或者逻辑转换。
一、分割两个字符串得到回文串
二、双指针
// 限定死了,在相同的下标处分开。
// 而其只要有一个能组成回文串即可。
// 回文是什么?前后对称相等。
// 暴力,从任何处分割,组合,再判定是否为回文串。
// ab两串相等,意味着分割之后组合的新字符串必定是和ab一样长的。
// 切割,能切几个算几个,反正字符串一样的就可以了,自字符串也好,它字符串也罢,管它谁提供的呐!解决问题足够抽象,没有感情!只有纯粹的需求。
// 一旦不能切了就只能看自己了。
func checkPalindromeFormation(a string, b string) bool {
// 都是看别人家的尾吧是否合我的身子!
return isVaild(a,b) || isVaild(b,a)
}
// 先惦记别家的,再看自己有没;不能先用自己的,再惦记别家的,这不合规矩。
func isVaild(a,b string) bool {
n := len(a)
for i := 0;i < n >> 1;i++ {
if a[i] != b[n - 1 - i] {
// bug1:不一定是身子占主体,去惦记别人的字符;也有可能是尾巴占主体!
return isPali(a,i) || isPali(b,i) // 以尾巴为主
}
}
return true
}
func isPali(s string,start int) bool {
n := len(s)
for i := start;i < n >> 1;i++ {
if s[i] != s[n - 1 - i] {
return false
}
}
return true
}
总结
1)有两类题,一类特点明显,可直觉看到特定类型的解法;一类需要具体分析,从背后发现潜在规律,寻找题解,这样一个完整的解题过程,该题属于第二种。
2)抛开具体的个性,直击需求,管它谁提供了这个需求,抽象成一种情况–提供需求。