正则表达式匹配(递归、字符串)
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
- '.' 匹配任意单个字符
- '*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 **整个 **字符串 s的,而不是部分字符串。 示例 1:
输入:s = "aa" p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:s = "aa" p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:
输入:s = "ab" p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
示例 4:
输入:s = "aab" p = "c*a*b"
输出:true
解释:因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
示例 5:
输入:s = "mississippi" p = "mis*is*p*."
输出:false
提示:
- 0 <= s.length <= 20
- 0 <= p.length <= 30
- s 可能为空,且只包含从 a-z 的小写字母。
- p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
- 保证每次出现字符 * 时,前面都匹配到有效的字符
以下程序实现了这一功能,请你填补空白处内容:
class Solution {
public boolean isMatch(String s, String p) {
if (p.length() == 0)
return s.length() == 0;
boolean head_match = s.length() > 0 && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.');
________________;
}
}
解答:
if (p.length() > 1 && p.charAt(1) == '*') {
return (head_match && isMatch(s.substring(1), p)) || isMatch(s, p.substring(2));
} else {
return head_match && isMatch(s.substring(1), p.substring(1));
}
字符串统计(算法初阶、排序和顺序统计量)
编写一个程序,对于输入的一段英语文本,可以统计:
- 该文本中有多少英语单词;
- 该文本中有多少不同的英语单词。 如,输入 I am a good student. I am in Zhengzhou. 则可以统计出有9个英语单词、7个不同的英语单词。
解答:
import java.util.HashMap;
import java.util.Map;
public class Tee {
public static String formatInput(String input) {
if (input == null) {
return null;
}
return input.replaceAll("[.|;|\\?]", " ");
}
public static Map<String, Integer> countWords(String input) {
Map<String, Integer> result = new HashMap<String, Integer>();
if (input == null || input.length() == 0) {
return result;
}
String[] split = input.split(" ");
if (split == null || split.length == 0) {
return result;
}
for (String value : split) {
if (result.containsKey(value)) {
result.put(value, result.get(value) + 1);
} else {
result.put(value, 1);
}
}
return result;
}
public static void main(String[] args) {
String value = "I am a good student.I am in Zhengzhou.Ha?";
String format = formatInput(value);
System.out.println(format);
Map<String, Integer> r = countWords(format);
System.out.println(r.toString());
}
}
寻找峰值(数组、二分查找)
峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞ 。 你必须实现时间复杂度为 O(log n)_ _的算法来解决此问题。
示例 1: 输入:nums = [1,2,3,1] 输出:2 解释:3 是峰值元素,你的函数应该返回其索引 2。 示例 2: 输入:nums = [1,2,1,3,5,6,4] 输出:1 或 5 解释:你的函数可以返回索引 1,其峰值元素为 2; 或者返回索引 5, 其峰值元素为 6。
提示:
- 1 <= nums.length <= 1000
- -231 <= nums[i] <= 231 - 1
- 对于所有有效的 i 都有 nums[i] != nums[i + 1]
解答:
class Solution {
public int findPeakElement(int[] nums) {
if (nums.length == 1)
return 0;
int len = nums.length;
int low = 0, mid = 0, high = nums.length - 1;
while (low < high) {
mid = (low + high) / 2;
if (nums[mid] > nums[mid + 1])
high = mid;
else
low = mid + 1;
}
return low;
}
}
本文内容到此结束了, 如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问💬欢迎各位大佬指出。 主页:共饮一杯无的博客汇总👨💻
保持热爱,奔赴下一场山海。🏃🏃🏃