1903-字符串中的最大奇数
给你一个字符串 num
,表示一个大整数。请你在字符串 num
的所有 非空子字符串 中找出 值最大的奇数
,并以字符串形式返回。如果不存在奇数,则返回一个空字符串 __""
__ 。
子字符串 是字符串中的一个连续的字符序列。
示例 1:
**输入:** num = "52"
**输出:** "5"
**解释:** 非空子字符串仅有 "5"、"2" 和 "52" 。"5" 是其中唯一的奇数。
示例 2:
**输入:** num = "4206"
**输出:** ""
**解释:** 在 "4206" 中不存在奇数。
示例 3:
**输入:** num = "35427"
**输出:** "35427"
**解释:** "35427" 本身就是一个奇数。
提示:
1 <= num.length <= 105
num
仅由数字组成且不含前导零
方法一:贪心
思路与算法
首先,如果 num 中不含有值为奇数的字符,那么 num 的任何子串的值都不可能是奇数,此时应返回空字符串 “”。
下面考虑 num 中含有值为奇数的字符的情况。假设 num}[j] 的数值是奇数,那么所有以 num}[j] 结尾的子串的数值都是奇数。由于 num 不含前导零,且在子串中前缀 num}[0..j+1] 的长度最长,因此这些子串中数值最大的为 num}[0..j+1]。
我们假设 num 中最后一个值为奇数的字符的下标为 j_0,那么对于任意值为奇数的下标 j,一定有 j \le j_0,即 num}[0..j_0+1] 的长度一定大于等于 num}[0..j_0+1] 的长度。同时,上述两个子串均不含前导零。那么,num 中值为奇数且值最大的子字符串即为 num}[0..j_0+1]。
我们从右到左遍历 num 中的字符,当遍历到第一个值为奇数的字符时,我们假设它的下标为 i,此时子字符串 num}[0..i+1] 即为值为奇数且值最大的子字符串,我们返回该子字符串作为答案。而如果 num 中不存在值为奇数的字符,我们则返回空字符串 “”。
代码
1 | class Solution { |
1 | class Solution: |
复杂度分析
时间复杂度:O(n),其中 n 为 num 的长度。遍历字符串和返回符合要求子串的时间复杂度均为 O(n)。
空间复杂度:O(1),输出字符串不计入空间复杂度。
Comments