J-Word Search

本文深入解析了WordSearch问题的算法实现,介绍了在一个单词网格中搜索单词的方法,涵盖水平、垂直和对角线方向的查找。文章详细展示了如何通过遍历网格和单词,使用标记数组来避免重复计数,以及如何判断解决方案的状态,包括无解、多解和唯一解的情况。代码示例使用C++编写,展示了高效的搜索策略。

Word Search

题意:单词搜索,在一个单词网中搜索单词,该单词可能存在这个网的水平,垂直,或对角线方向。

        no solution:有词汇未在方阵图中出现;

        ambiguous:词汇在方阵图中出现了两次;

        empty solution:所有词汇均出现且仅出现一次,最终方阵图无未标记字母;

        此外则依次输出剩余大写字母。

// Solution to Word Search
// Author: Thomas Beuman

// Time complexity: O(n*h*w*wordlength)
// Memory: O(h*w)

// @EXPECTED_RESULTS@: CORRECT

#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

const int hmax = 32, wmax = 32, lmax = 32;

char Grid[hmax][wmax+1];
char Word[lmax+1];

bool Marked[hmax][wmax];
//控制8个方向矩阵
int di[] = {-1,-1,-1,0,0,1,1,1};
int dj[] = {-1,0,1,-1,1,-1,0,1};

int main()
{	int runs, run, n, h, w, d, i, j, k, m, s, i2, j2, solutions;
	bool nosolution, ambiguous, palindrome, empty;
	scanf("%d", &runs);
	for (run = 0; run < runs; run++)
	{	
		// Read input
		scanf("%d %d %d", &n, &h, &w);
		for (i = 0; i < h; i++)
			scanf("%s", Grid[i]);

		memset(Marked, false, sizeof(Marked));
		nosolution = ambiguous = false;

		// Process the words
		for (s = 0; s < n; s++)
		{	scanf("%s", Word);
			m = strlen(Word);
			//检查是否回文
			for (k = 0; k < (m-1)/2 && Word[k] == Word[m-1-k]; k++);
			palindrome = (k == (m-1)/2);
			solutions = 0;

			// 尝试所有的开始的位置和矩阵
			for (i = 0; i < h; i++)
				for (j = 0; j < w; j++)
					for (d = 0; d < 8; d++)
					{	for (k = 0; k < m; k++)
						{	i2 = i + k * di[d];
							j2 = j + k * dj[d];
							if (i2 < 0 || i2 >= h || j2 < 0 || j2 >= w || Grid[i2][j2] != Word[k])
								break;
						}
						if (k == m) // 查找到单词
						{	for (k = 0; k < m; k++)
								Marked[i+k*di[d]][j+k*dj[d]] = true;
							solutions++;
						}
					}
			if (solutions == 0)
				nosolution = true;
			if (!(solutions == 1 || (palindrome && solutions == 2) || (m == 1 && solutions == 8)))
				ambiguous = true;
		}

		// 输出答案
		if (nosolution)
			printf("no solution\n");
		else if (ambiguous)
			printf("ambiguous\n");
		else
		{	// Print unmarked letters
			empty = true;
			for (i = 0; i < h; i++)
				for (j = 0; j < w; j++)
					if (!Marked[i][j])
					{	printf("%c", Grid[i][j]);
						empty = false;
					}
			if (empty)
				printf("empty solution");
			printf("\n");
		}
	}
	return 0;
}

### Python 实现敏感词过滤的方法 #### 方法一:基于列表匹配的简单实现 最基础的方式是通过遍历待检测字符串中的每一个子串来判断是否存在敏感词。这种方式虽然直观易懂,但是效率较低。 ```python def filter_words(text, word_list): for word in word_list: if word in text: text = text.replace(word, '*' * len(word)) return text ``` 这种方法适用于敏感词汇较少的情况[^1]。 #### 方法二:正则表达式替换法 利用Python内置`re`模块提供的强大模式匹配功能来进行批量查找并替换指定字符序列。此方案灵活性高,支持复杂条件下的精确控制。 ```python import re def regex_replace(text, pattern_dict): compiled_patterns = {k: re.compile(v) for k, v in pattern_dict.items()} def replacer(match_obj): matched_str = match_obj.group(0) mask_char = '*' return ''.join([mask_char]*len(matched_str)) result_text = text for _, ptn in compiled_patterns.items(): result_text = ptn.sub(replacer, result_text) return result_text ``` 该函数接收两个参数:一个是目标文本;另一个是由关键词映射到对应正则式的字典对象。它会依次应用这些规则完成最终转换过程。 #### 方法三:前缀树(Trie Tree)/DFA算法优化版 对于大规模数据集而言,上述两种策略可能无法满足性能需求。此时可以考虑采用Trie结构存储所有已知关键字,并在此基础上构建有限状态自动机(Deterministic Finite Automaton),从而加速查询速度。 ```python class TrieNode(object): def __init__(self): self.children = {} self.is_end_of_word = False def add_keyword(trie_root, keyword): node = trie_root for char in keyword.lower().strip(): if char not in node.children: new_node = TrieNode() node.children[char] = new_node node = node.children.get(char) node.is_end_of_word = True def search_keywords(sentence, trie_root): results = [] sentence_length = len(sentence) i = 0 while i < sentence_length: j = i current_node = trie_root while (j < sentence_length and sentence[j].lower() in current_node.children): current_node = current_node.children[sentence[j].lower()] if current_node.is_end_of_word: results.append((i,j+1)) # 记录起始位置 j += 1 i += max(j-i, 1) masked_sentence = list(sentence) for start,end in reversed(results): length = end-start replacement = "*" * length masked_sentence[start:end] = replacement return "".join(masked_sentence),results ``` 这段代码定义了一个简单的Trie节点类以及相应的插入和搜索操作。当遇到敏感词语时即刻返回其所在区间以便后续处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值