第四周 深度优先搜索

算法题目 : Expression Add Operators          

算法题目描述: 

Given a string that contains only digits 0-9 and a target value, return all possibilities to add binary operators (not unary) +, -, or * between the digits so they evaluate to the target value.

Examples:

"123", 6 -> ["1+2+3", "1*2*3"] 
"232", 8 -> ["2*3+2", "2+3*2"]
"105", 5 -> ["1*0+5","10-5"]
"00", 0 -> ["0+0", "0-0", "0*0"]
"3456237490", 9191 -> []

算法分析:

这道题目主要就是问给定一串数,在数字中间插入操作符构成表达式,计算表达式,使得结果等于target。

因为要输出所有可能的情况,所以优先想到的就是用深度优先搜索。问题在于如何将问题拆分成多次搜索。加减法很好处理,每当我们截出一段数字时,将之前计算的结果加上或者减去这个数,就可以将剩余的数字字符串和新的计算结果代入下一次搜索中了,直到我们的计算结果和目标一样,就完成了一次搜索。而对于*并且之前为+或-,需要恢复上一次+或-的计算值,先计算当前的*,然后再执行之前运算的逆运算。这样下来我们计算得到的时间复杂度是O(n^2),这相比LeetCode里面的其他大神用的算法最快可达到O(n)来说,就显得很慢了,但是大神用的算法实在是看不懂,应该是用了加入了一些分治的思想。我们还是用简单易懂的DFS来实现吧。


算法代码(C++):

class Solution {
public:
    vector<string> addOperators(string num, int target) {
        vector<string> res;
        string temp;
        dfs(res, num, temp, target, 0, 0, 0);
        return res;
    }
    
    void dfs(vector<string>& res, const string& nums, string temp, const int target, int start, long long pre_val, long long cur_res){
        if(start==nums.size()){
            if(cur_res==target){
                res.push_back(temp);
            }
            return;
        }
        for(int i=1;i+start<=nums.size();++i){
            string num=nums.substr(start,i);
            if(num.size()>1&&num[0]=='0')
                return;
            long long cur=stoll(num);
            if(start==0){
                dfs(res, nums, num, target, i, cur, cur);
            }
            else{
                dfs(res, nums, temp+"+"+num, target, start+i, cur, cur_res+cur);
                dfs(res, nums, temp+"-"+num, target, start+i, -cur, cur_res-cur);
                dfs(res, nums, temp+"*"+num, target, start+i, pre_val*cur, cur_res-pre_val+pre_val*cur);
            }
        }
        
    }
};






**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值