290.Word Pattern--hashmap使用,字符匹配

本文介绍了一个LeetCode上的编程挑战——WordPattern问题的解决方案。该问题要求判断给定的模式和字符串是否完全匹配,即模式中的每个字符是否能与字符串中的单词建立一一对应的映射关系。

290. Word Pattern

Given a pattern and a string str, find if str follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in str.

Examples:

  1. pattern = "abba", str = "dog cat cat dog" should return true.
  2. pattern = "abba", str = "dog cat cat fish" should return false.
  3. pattern = "aaaa", str = "dog cat cat dog" should return false.
  4. pattern = "abba", str = "dog dog dog dog" should return false.

Notes:
You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space.

大致题意:上所示,给定一个字母的格式排序,判定其后的字符串是否仍是这样的排序:

public class Solution {
    public boolean wordPattern(String pattern, String str) {
    HashMap<Character,String> map = new HashMap<Character,String>();
     String[] arr = str.split(" ");
     if(arr.length!=pattern.length()) return false;
    for(int i = 0; i< pattern.length(); i++){
         char a = pattern.charAt(i);
         String b = arr[i];
         if(map.containsKey(a)){
             if(map.get(a).equals(b)){
                 continue;
             }
             return false;
         }else{
           if(map.containsValue(b)){
                 return false;
             }else{
             map.put(a,b);
             }
         }
        }
         return true;
    }
}

其中的如何将字符串分离出来,耽误了较长时间,将字符串按空格分离而后,保存成数组格式。

可以使用split 搞定,这个方法挺厉害的;(哥哥最近有点郁闷,脑袋疼)

原文链接:“https://leetcode.com/problems/word-pattern/

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*; import java.util.regex.*; public class WebCrawlerApp extends JFrame { // 界面组件 private JTextField urlField = new JTextField(40); private JTextArea resultArea = new JTextArea(20, 60); private JButton fetchBtn = new JButton("抓取网页"); private JButton batchBtn = new JButton("批量处理"); private JButton saveSensitiveBtn = new JButton("保存敏感词"); // 数据存储 private Set<String> visitedUrls = new HashSet<>(); private Set<String> sensitiveWords = new HashSet<>(); private Set<String> foundEmails = new HashSet<>(); private Map<String, Set<String>> sensitiveRecords = new HashMap<>(); public WebCrawlerApp() { super("简易网页爬虫"); setupUI(); loadSensitiveWords("sensitive_words.txt"); } private void setupUI() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); // 主布局 JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); // 顶部输入区域 JPanel topPanel = new JPanel(); topPanel.add(new JLabel("网址:")); topPanel.add(urlField); topPanel.add(fetchBtn); topPanel.add(batchBtn); topPanel.add(saveSensitiveBtn); // 结果区域 JScrollPane scrollPane = new JScrollPane(resultArea); resultArea.setEditable(false); // 事件监听 fetchBtn.addActionListener(e -> fetchSingleUrl()); batchBtn.addActionListener(e -> batchProcess()); saveSensitiveBtn.addActionListener(e -> saveSensitiveRecords()); mainPanel.add(topPanel, BorderLayout.NORTH); mainPanel.add(scrollPane, BorderLayout.CENTER); add(mainPanel); } // ================= 核心功能实现 ================= private void fetchSingleUrl() { String url = urlField.getText().trim(); if (url.isEmpty()) return; processUrl(url); } private void batchProcess() { JFileChooser chooser = new JFileChooser(); if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String url; while ((url = reader.readLine()) != null) { urlField.setText(url); processUrl(url); } } catch (Exception e) { resultArea.append("\n批量处理错误: " + e.getMessage()); } } } private void processUrl(String urlStr) { try { // 避免重复爬取 if (visitedUrls.contains(urlStr)) { resultArea.append("\n[跳过] 已访问URL: " + urlStr); return; } visitedUrls.add(urlStr); // 处理相对地址 URL baseUrl = new URL(urlStr); URLConnection conn = baseUrl.openConnection(); conn.setRequestProperty("User-Agent", "Mozilla/5.0"); conn.setConnectTimeout(5000); // 猜测编码 String charset = "UTF-8"; String contentType = conn.getContentType(); if (contentType != null) { for (String param : contentType.replace(" ", "").split(";")) { if (param.startsWith("charset=")) { charset = param.split("=")[1]; break; } } } // 读取内容 StringBuilder content = new StringBuilder(); try (BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream(), charset))) { String line; while ((line = reader.readLine()) != null) { content.append(line).append("\n"); } } // 验证HTML内容 if (!content.toString().toLowerCase().contains("<html")) { resultArea.append("\n[警告] 非HTML内容: " + urlStr); return; } // 提取纯文本敏感词 String plainText = extractPlainText(content.toString()); Set<String> detectedWords = detectSensitiveWords(plainText); sensitiveRecords.put(urlStr, detectedWords); // 提取Email extractEmails(content.toString()); // 显示结果 resultArea.append("\n\n===== 抓取结果 =====\n"); resultArea.append("URL: " + urlStr + "\n"); resultArea.append("编码: " + charset + "\n"); resultArea.append("敏感词: " + detectedWords.size() + "个\n"); resultArea.append("发现Email: " + foundEmails.size() + "个"); } catch (Exception e) { resultArea.append("\n[错误] " + e.getMessage()); } } // ================= 数据处理方法 ================= private String extractPlainText(String html) { // 简易HTML标签去除 return html.replaceAll("<[^>]+>", " "); } private Set<String> detectSensitiveWords(String text) { Set<String> detected = new HashSet<>(); for (String word : sensitiveWords) { if (text.toLowerCase().contains(word.toLowerCase())) { detected.add(word); } } return detected; } private void extractEmails(String content) { Pattern pattern = Pattern.compile("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b"); Matcher matcher = pattern.matcher(content); while (matcher.find()) { foundEmails.add(matcher.group()); } } private void loadSensitiveWords(String filename) { try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { String line; while ((line = reader.readLine()) != null) { sensitiveWords.add(line.trim().toLowerCase()); } resultArea.append("已加载敏感词: " + sensitiveWords.size() + "个"); } catch (Exception e) { resultArea.append("敏感词库加载失败: " + e.getMessage()); } } private void saveSensitiveRecords() { try (PrintWriter writer = new PrintWriter("sensitive_records.txt")) { for (Map.Entry<String, Set<String>> entry : sensitiveRecords.entrySet()) { writer.println("URL: " + entry.getKey()); writer.println("敏感词: " + String.join(", ", entry.getValue())); writer.println("----------------------"); } resultArea.append("\n敏感词记录已保存到 sensitive_records.txt"); } catch (Exception e) { resultArea.append("\n保存失败: " + e.getMessage()); } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { WebCrawlerApp app = new WebCrawlerApp(); app.setVisible(true); }); } } 帮我优化这段代码
最新发布
06-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值