import static util.Asserts.*; /** * ç»å®ä¸ä¸ªå符串ï¼ä½ ç任塿¯è®¡ç®è¿ä¸ªåç¬¦ä¸²ä¸æå¤å°ä¸ªåæå串ã * * å ·æä¸åå¼å§ä½ç½®æç»æä½ç½®çå串ï¼å³ä½¿æ¯ç±ç¸åçåç¬¦ç»æï¼ä¹ä¼è¢«è®¡ä¸ºæ¯ä¸åçå串ã * * ç¤ºä¾ 1: * * è¾å ¥: "abc" * è¾åº: 3 * è§£é: ä¸ä¸ªåæå串: "a", "b", "c". * ç¤ºä¾ 2: * * è¾å ¥: "aaa" * è¾åº: 6 * 说æ: 6个åæå串: "a", "a", "a", "aa", "aa", "aaa". * 注æ: * * è¾å ¥çå符串é¿åº¦ä¸ä¼è¶ è¿1000ã * * æ¥æºï¼åæ£ï¼LeetCodeï¼ * 龿¥ï¼https://leetcode-cn.com/problems/palindromic-substrings * è使å½é¢æ£ç½ç»ææãåä¸è½¬è½½è¯·èç³»å®æ¹ææï¼éåä¸è½¬è½½è¯·æ³¨æåºå¤ã * * @author abomb4 2020-01-12 */ public class Solution647 { /** * å·²ç¥æåæçæ åµä¸ï¼åä¸¤ç«¯å¯»æ¾æ´é¿çåæ * * @param chars åå§ chars * @param left 左侧æé * @param right å³ä¾§æé * @return åææ¬¡æ°ï¼è³å°ä¸º 1 */ private int count(char[] chars, int left, int right) { int sum = 1; final int length = chars.length; while(true) { left = left - 1; right = right + 1; if (left < 0 || right >= length) { return sum; } if (chars[left] != chars[right]) { return sum; } sum++; } } public int countSubstrings(String s) { // è¦æ»¡è¶³åæè¦æ±ï¼åå½åå ç´ ä¸åä¸ä¸ªæåå两个å ç´ æ¯ç¸åçï¼condition 1ï¼ã // 满足 condition 1 çæ¶åï¼å两侧æ©å±æç´¢ int sum = s.length(); final char[] chars = s.toCharArray(); for (int i = 1; i < chars.length; i++) { final char current = chars[i]; final int i1 = i - 1; final char previous = chars[i1]; if (current == previous) { // è¿å ¥åææç´¢ç¶æ sum += count(chars, i1, i); } final int i2 = i - 2; if (i2 >= 0) { final char previous2 = chars[i2]; if (current == previous2) { sum += count(chars, i2, i); } } } return sum; } public static void main(String[] args) { final Solution647 s = new Solution647(); { final String tst = "abc"; final int rst = 3; final int result = s.countSubstrings(tst); assertEquals(rst, result, "计ç®1"); } { final String tst = "aaa"; final int rst = 6; final int result = s.countSubstrings(tst); assertEquals(rst, result, "计ç®2"); } { // 'a', 'c', 'a', 'aca' final String tst = "aca"; final int rst = 4; final int result = s.countSubstrings(tst); assertEquals(rst, result, "计ç®3"); } { // 8, 'ff', 'dffd', 'sdffds', 'asdffdsa' final String tst = "asdffdsa"; final int rst = 12; final int result = s.countSubstrings(tst); assertEquals(rst, result, "计ç®4"); } { // 5, '101', '010', '10101', '101' final String tst = "10101"; final int rst = 9; final int result = s.countSubstrings(tst); assertEquals(rst, result, "计ç®5"); } System.out.println("OK"); } }