某大廠HR準備裁一個36歲的程序員,找他談話的時候,得知他剛離婚被出軌,孩子可能還不是親生的。突然意思到他毫無軟肋,有可能做出極端事件,為防止意外發生,于是決定不裁他了,把一個剛結婚準備要小孩的女員工裁掉。
對于這個行為很多網友是非常支持的,給出的理由是不可把人給逼到絕路。確實,都已經那么慘了,沒必要在雪上加霜,不過那個被裁的女員工就很不幸了。
--------------下面是今天的算法題--------------
來看下今天的算法題,這題是LeetCode的第1332題,刪除回文子序列,難度是簡單。
給你一個字符串 s,它僅由字母 'a' 和 'b' 組成。每一次刪除操作都可以從 s 中刪除一個回文 子序列。返回刪除給定字符串中所有字符(字符串為空)的最小刪除次數。
「子序列」定義:如果一個字符串可以通過刪除原字符串某些字符而不改變原字符順序得到,那么這個字符串就是原字符串的一個子序列。
「回文」定義:如果一個字符串向后和向前讀是一致的,那么這個字符串就是一個回文。
示例1:
輸入:s = "ababa" 輸出:1 解釋:字符串本身就是回文序列,只需要刪除一次。
示例2:
輸入:s = "baabb" 輸出:2 解釋:"baabb" -> "b" -> "". 先刪除回文子序列 "baab",然后再刪除 "b"。
1 <= s.length <= 1000
s 僅包含字母 'a' 和 'b'
問題分析
這題說的是每次從字符串中刪除一個回文子序列,問最少需要多少次可以把字符串全部刪除完,字符串中只包含字符 a 和 b 。
因為相同的字符構成的字符串一定是回文串,所以只包含 a 和 b 的字符串至少有兩個回文子序列,所以無論怎么排列,我們最少可以刪除 2 次。但是如果給定的字符串本來就是回文的,我們可以全部一次性刪除,只需要刪除一次即可。
所以這里我們判斷給定的字符串是否是回文的,如果是回文的,刪除 1 次,否則刪除 2 次。
JAVA:
public int removePalindromeSub(String s) { int n = s.length(); for (int i = 0; i < n / 2; ++i) { if (s.charAt(i) != s.charAt(n - 1 - i)) return 2;// 如果不是回文串,返回 2 。 } return 1;// 如果是回文串,返回 1 。 }
C++:
public: int removePalindromeSub(string s) { int n = s.length(); for (int i = 0; i < n / 2; ++i) { if (s[i] != s[n - 1 - i]) return 2;// 如果不是回文串,返回 2 。 } return 1;// 如果是回文串,返回 1 。 }
筆者簡介
博哥,真名:王一博,畢業十多年, 作者,專注于 數據結構和算法 的講解,在全球30多個算法網站中累計做題2000多道,在公眾號中寫算法題解900多題,對算法題有自己獨特的解題思路和解題技巧。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.