BM74 数字字符串转化成IP地址(python)

题目

题目链接
给出一个纯数字字符串,将字符串分割为合法的ip地址,返回所有可能的情况
在这里插入图片描述

思路

判断ip地址的一部分是否合法
  • 需要在0~255之间
  • 不能有前导0,如02、002不合法(但只有一个0为合法)
  • 不能为空
递归回溯

使用三个参数s,cell,IPs
s:剩余的还未使用的字符串
cell:本次递归已经生成的ip地址数组,内含0-4个合法的数字
IPs:存放所有已生成的合法ip数组

递归结束的条件
cell中有4个合法的数字,且s中没有剩余的数字,则把cell加入IPs中,退递归

递归中的操作

从字符串首部开始,循环检查1~3个连续的数字 :

  1. 若当前的数字合法,把该数字加入cell
  2. s中剩下的数字继续递归
  3. 递归结束后,把刚才加入cell的数字移出(回溯)

代码

class Solution:
	# 判断当前数字是否合法
    def isOK(self, s):
        if not s: #不能为空
            return False
        if len(s) > 1 and s[0] == '0': #不能有前导0
            return False
        if int(s) > 255: #不能大于255
            return False
        return True
        
	# 根据4个数字,生成带点的ip地址字符串
    def makeIP(self,s):
        ip=''
        for i in range(3):
            ip+=s[i]+'.'
        return ip+s[-1]
        
	# dfs递归回溯
    def dfsIP(self, s, cell, IPs):
        if len(cell) == 4 and not s: # 已有4个数字,且没有剩下未使用的数字
            IPs.append(self.makeIP(cell))
            return
        # 取长度1-3的数字检查
        for i in range(0, len(s)):
            if i == 3:
                break
            # 若合法,加入cell
            if self.isOK(s[:i + 1]):
                cell.append(s[:i + 1])
                # 把剩下的数字递归
                self.dfsIP(s[i + 1:], cell, IPs)
                # 退递归之后回溯
                cell.pop()

    def restoreIpAddresses(self, s):
        cell, IPs = [], []
        self.dfsIP(s, cell, IPs)
        return IPs
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现: 1. 首先需要建立一个病毒库,里面包含了各种病毒的特征字符串。这些字符串可以是病毒的特定代码片段、指令序列或其他特征。在代码中,我们可以将病毒库放在一个列表或集合中。 2. 接下来,我们需要读取要检测的文件,将其转换为字符串类型。 3. 然后,我们需要对该字符串进行模式匹配,以查找是否存在病毒特征字符串。对于模式匹配,可以使用KMP、BM、RK等算法,这里我们以KMP算法为例。 4. 如果在文件中找到了病毒特征字符串,那么说明该文件可能被感染,需要进行相应的处理。如果没有找到,则说明该文件没有被感染。 代码实现: ```python # 建立病毒库 virus_library = {'virus1': 'abc', 'virus2': 'def', 'virus3': 'ghi'} # 读取要检测的文件 with open('file.txt', 'r') as f: content = f.read() # KMP算法实现字符串匹配 def KMP(text, pattern): n, m = len(text), len(pattern) if m == 0: return 0 next = [0] * m j = 0 for i in range(1, m): while j > 0 and pattern[j] != pattern[i]: j = next[j-1] if pattern[j] == pattern[i]: j += 1 next[i] = j j = 0 for i in range(n): while j > 0 and pattern[j] != text[i]: j = next[j-1] if pattern[j] == text[i]: j += 1 if j == m: return i-m+1 return -1 # 检测文件是否感染病毒 for virus in virus_library.values(): if KMP(content, virus) != -1: print('The file is infected by virus!') break else: print('The file is not infected by virus.') ``` 参考资料: [1] 《算法导论》 [2] https://www.cnblogs.com/nullzx/p/7499399.html [3] https://github.com/keon/algorithms/blob/master/algorithms/string/kmp.py

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值