0
点赞
收藏
分享

微信扫一扫

正则表达式匹配(递归、字符串)、字符串统计(算法初阶、排序和顺序统计量)、寻找峰值(数组、二分查找)

正则表达式匹配(递归、字符串)

给你一个字符串 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));
}

字符串统计(算法初阶、排序和顺序统计量)

编写一个程序,对于输入的一段英语文本,可以统计:

  1. 该文本中有多少英语单词;
  2. 该文本中有多少不同的英语单词。 如,输入 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;
    }
}

本文内容到此结束了, 如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问💬欢迎各位大佬指出。 主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

举报

相关推荐

0 条评论