题解 | #牛群编号的回文顺序II#
牛群编号的回文顺序II
https://www.nowcoder.com/practice/e887280579bb4d91934378ea359f632e
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ #include <stdio.h> void getNums(struct ListNode* head, int* res, int* length) { while (head) { res[(*length)++] = head->val; head = head->next; } } bool ishuiwen(int* nums, int start, int end) { while (start < end) { if (nums[start] != nums[end]) { return false; } else { start++; end--; } } return true; } struct ListNode* maxPalindrome(struct ListNode* head ) { int* res = malloc(sizeof(int) * 100000); int length = 0; getNums(head, res, &length); if (ishuiwen(res, 0, length - 1)) { return NULL; } else { int start = 0, end = 0; int max = -1; for (int i = 1; i < length - 1; i++) { int left = i - 1, right = i + 1; while (left >= 0 && right < length && res[left] == res[right]) { left--; right++; } if (left == i - 1 && right == i + 1) { if (res[left] == res[i]) { start = left; end = i; } if (res[right] == res[i]) { start = i; end = right; } } else { left++; right--; if (right - left + 1 > max) { max = right - left + 1; start = left; end = right; } } } for (int i = 0; i < length - 1; i++) { if (res[i] == res[i + 1]) { int start1 = i, end1 = i + 1; while (start1 >= 0 && end1 < length && res[start1] == res[end1]) { start1--; end1++; } start1++; end1--; if (end1 - start1 + 1 > max) { max = end1 - start1 + 1; start = start1; end = end1; } } } struct ListNode* node = malloc(sizeof(struct ListNode)); struct ListNode* num = node; node->next = NULL; for (int i = start; i <= end; i++) { struct ListNode* temp = malloc(sizeof(struct ListNode)); temp->val = res[i]; temp->next = NULL; node->next = temp; node = temp; } return num->next; } }
注意从回文字符串长度的奇偶性来分别讨论