zoukankan      html  css  js  c++  java
  • LeetCode OJ : Different Ways to Add Parentheses(在不同位置增加括号的方法)

    Given a string of numbers and operators,

    return all possible results from computing all the different possible ways

    to group numbers and operators. The valid operators are+- and *.


    Example 1

    Input: "2-1-1".

    ((2-1)-1) = 0
    (2-(1-1)) = 2

    Output: [0, 2]


    Example 2

    Input: "2*3-4*5"

    (2*(3-(4*5))) = -34
    ((2*3)-(4*5)) = -14
    ((2*(3-4))*5) = -10
    (2*((3-4)*5)) = -10
    (((2*3)-4)*5) = 10

    Output: [-34, -14, -10, -10, 10]

    这里的主要思想是讲左右的子串分别算出来之后,再做全排列就行了,可能有很所重复计算所以说效率比较低

     1 class Solution {
     2 public:
     3     vector<int> diffWaysToCompute(string input) {
     4         vector<int> result;
     5         int length = input.length();
     6         for(int i = 0; i < length; ++i){
     7             char c = input[i];
     8             if(c == '+' || c == '-' || c == '*'){
     9                 string inputLeft = input.substr(0, i);
    10                 string inputRight = input.substr(i+1);
    11                 vector<int>leftResult = diffWaysToCompute(inputLeft);
    12                 vector<int>rightResult = diffWaysToCompute(inputRight);
    13                 for(int j = 0; j < leftResult.size(); ++j){
    14                     for(int k = 0; k < rightResult.size(); ++k){
    15                         if(c == '+')
    16                             result.push_back(leftResult[j] + rightResult[k]);
    17                         else if(c == '-')
    18                             result.push_back(leftResult[j] - rightResult[k]);
    19                         else if(c == '*')
    20                             result.push_back(leftResult[j] * rightResult[k]);
    21                     }
    22                 }
    23             }       
    24         }
    25         if(result.empty())//这一步主要的作用是讲分治得到的最后的字符转换成数字
    26             result.push_back(stoi(input));
    27         return result;
    28     }
    29 };

     java版本如下所示:

     1 public class Solution {
     2     public List<Integer> diffWaysToCompute(String input) {
     3         ArrayList<Integer> ret = new ArrayList<Integer>();
     4         for(int i = 0; i < input.length(); ++i){
     5             char c = input.charAt(i);
     6             if(c == '+' || c == '-' || c == '*'){
     7                 List<Integer> leftRet = diffWaysToCompute(input.substring(0, i));
     8                 List<Integer> rightRet = diffWaysToCompute(input.substring(i+1, input.length()));
     9                 for(int left : leftRet){
    10                     for(int right : rightRet){
    11                         if(c == '+'){
    12                             ret.add(left + right);
    13                         }else if(c == '-'){
    14                             ret.add(left - right);
    15                         }else{
    16                             ret.add(left * right);
    17                         }
    18                     }
    19                 }
    20             }
    21         }
    22         if(ret.isEmpty()){
    23             ret.add(Integer.parseInt(input));
    24         }
    25         return ret;
    26     }
    27 }
  • 相关阅读:
    vss的ss.ini丢失或损坏导致的vss无法登录错误
    NHibernate各种数据库连接参数文件配置方法说明
    oracle操作语句
    企业微信群聊机器人发送本地图片
    securecrt 或xshell 转发80端口
    SecureCRT 或 XSHELL 转发 X11 图形化GUI
    Windows 创建 .gdbinit 提示必须键入文件名
    vscode C++ 程序 windows
    vscode C++ 程序 windows
    解决source insight 4.0 不识别.cc文件的问题
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4853883.html
Copyright © 2011-2022 走看看