好!maximum-product-of-word-lengths

以后看到个数比较少,性能比较高,就要第一时间想到位操作!

这道题目mock没有通过。超时了。。。。。。

原来题目解法的思路非常非常好!

开始我关注于降低n*n的复杂度,但是这道题目复杂度高在每个字符串长,所以一定要问清楚题目

新做的记录:
package com.company;

import java.util.*;
import java.util.List;

class Solution {
    public int maxProduct(String[] words) {
        // int是32位,足够处理了。真的很牛逼
        // 以后看到个数比较少,性能比较高,就要第一时间想到位操作!
        // 开始我关注于降低n*n的复杂度,但是这道题目复杂度高在每个字符串长,所以一定要问清楚题目
        List<Integer> ilist = new ArrayList<>();
        for (int i=0; i<words.length; i++) {
            int nb = 0;
            for (int j=0; j<words[i].length(); j++) {
                nb |= 1 << (words[i].charAt(j) - ‘a‘);
            }
            ilist.add(nb);
        }
        int ret = 0;
        for (int i=0; i<words.length; i++) {
            for (int j=i+1; j<words.length; j++) {
                if ((ilist.get(i) & ilist.get(j)) == 0) {
                    if (words[i].length() * words[j].length() > ret) {
                        ret = words[i].length() * words[j].length();
                    }
                }
            }
        }
        return ret;
    }
}

public class Main {

    public static void main(String[] args) {
        // write your code here
        System.out.println("Hello");
        Solution solution = new Solution();

        String[] words= {"cdea","bdd"};
        int ret = solution.maxProduct(words);
        System.out.printf("Get ret: %d\n", ret);

    }
}

原来做过的记录

https://leetcode.com/problems/maximum-product-of-word-lengths/

// 我在尽量做到比n*n效率更高
// 对比new solution和previous solution
// new solution 是纯n*n,优化在字符串比较
// 对于大数据,耗时0ms
// previous solution理论上比n*n要快,
// 但是因为涉及vector的频繁增删、复制
// 实际要慢的多,对于大数据耗时800+ms

// 总的来看,stl container的复制、删除等,耗时很大

class Solution {
    vector<pair<int, int>> vec;
    vector<string> words;
    int **DP;
    // 比较的好方法
    int *bits;

    static bool my_compair(const string &a, const string &b) {
        if (a.size() > b.size()) {
            return true;
        }
        else {
            return false;
        }
    }

    void insert(int i, int j) {
        int f = words[i].size() * words[j].size();

        int vlen = vec.size();
        int begin = 0;
        int end = vlen - 1;

        int mid;
        int tmp;
        while (begin <= end) {
            mid = (begin + end) / 2;
            tmp = words[vec[mid].first].size() * words[vec[mid].second].size();

            if (f == tmp) {
                begin = mid + 1;
                break;
            }
            else if (f > tmp) {
                end = mid - 1;
            }
            else {
                begin = mid + 1;
            }
        }
        vec.insert(vec.begin()+begin, make_pair(i, j));
    }

    int valid(int i, int j) {
        if ((bits[i] & bits[j]) != 0) {
            return 0;
        }
        return words[i].size() * words[j].size();
    }

public:
    int maxProduct(vector<string>& w) {
        words = w;

        int wlen = words.size();
        if (wlen == 0) {
            return 0;
        }
        sort(words.begin(), words.end(), my_compair);

        // 初始化bits
        bits = new int[wlen];
        memset(bits, 0, sizeof(int)*wlen);
        for (int i=0; i<wlen; i++) {
            string wstr = words[i];
            int slen = wstr.size();
            for (int j=0; j<slen; j++) {
                bits[i] |= 1 << (wstr[j]-‘a‘);
            }
        }

        // new solution(0 ms for big test case)
        int result = 0;
        for (int i=0; i<wlen-1; i++) {
            for (int j=i+1; j<wlen; j++) {
                if ((bits[i]&bits[j]) == 0) {
                    int tmp = words[i].size() * words[j].size();
                    if (tmp > result) {
                        result = tmp;
                    }
                }
            }
        }
        return result;

        // previous solution (800ms for big test case)
        DP = new int*[wlen];
        for (int i=0; i<wlen; i++) {
            DP[i] = new int[wlen];
            // 注意,new出来的数据初始值,不一定为0
            memset(DP[i], 0, sizeof(int)*wlen);
        }

        // 根据相乘的长度排序
        vec.push_back(make_pair(0, 1));
        DP[0][1] = 1;

        int fir;
        int sec;
        int tmp;

        while (!vec.empty()) {
            fir = vec[0].first;
            sec = vec[0].second;
            vec.erase(vec.begin());

            tmp = valid(fir, sec);
            if (tmp > result) {
                result = tmp;
            }

            if (fir + 1 < sec && DP[fir+1][sec] == 0 &&
                words[fir+1].size() * words[sec].size() > result) {
                insert(fir+1, sec);
                DP[fir+1][sec] = 1;
            }
            if (sec + 1 < wlen && DP[fir][sec+1] == 0 &&
                words[fir].size() * words[sec+1].size() > result) {
                insert(fir, sec+1);
                DP[fir][sec+1] = 1;
            }
        }
        return result;
    }
};

// 下面是我在 Mock里面做的,超时了。重来。
package com.company;

import java.awt.*;
import java.util.*;
import java.util.List;

class Solution {
    public int maxProduct(String[] words) {
        // 直接用n*n*size的方法肯定不好
        // 注意限制条件, lower case的字符

        Map<Integer, Set<Integer>> mp = new HashMap<>();

        List<Integer> clist = new ArrayList<>();

        for (int i=0; i<words.length; i++) {
            clist.add(i);

            // 过滤
            char[] chs = words[i].toCharArray();
            Set<Integer> wSet = new HashSet();
            for (char ch :chs) {
                wSet.add(ch - ‘a‘);
            }
            Iterator<Integer> iter = wSet.iterator();
            while (iter.hasNext()) {
                int key = iter.next();
                if (!mp.containsKey(key)) {
                    Set<Integer> st = new HashSet<>();
                    st.add(i);
                    mp.put(key, st);
                }
                else {
                    Set<Integer> st = mp.get(key);
                    st.add(i);
                    mp.put(key, st);
                }
            }

        }

        int ret = 0;
        for (int i=0; i<words.length; i++) {
            Set<Integer> oSet = new HashSet<>(clist);
            char[] chs = words[i].toCharArray();
            Set<Integer> wSet = new HashSet();
            for (char ch :chs) {
                wSet.add(ch - ‘a‘);
            }
            Iterator<Integer> iter = wSet.iterator();
            while (iter.hasNext()) {
                int key = iter.next();
                Set<Integer> st = mp.get(key);
                oSet.removeAll(st);
            }
            iter = oSet.iterator();
            while (iter.hasNext()) {
                int index = iter.next();
                if (words[i].length() * words[index].length() > ret) {
                    ret = words[i].length() * words[index].length();
                }
            }
        }
        return ret;

    }
}

public class Main {

    public static void main(String[] args) {
        // write your code here
        System.out.println("Hello");
        Solution solution = new Solution();

        String[] words= {};
        int ret = solution.maxProduct(words);
        System.out.printf("Get ret: %d\n", ret);

    }
}
时间: 2024-09-29 17:15:57

好!maximum-product-of-word-lengths的相关文章

Maximum Product of Word Lengths

Maximum Product of Word Lengths Total Accepted: 750 Total Submissions: 2060 Difficulty: Medium Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume tha

318. Maximum Product of Word Lengths ——本质:英文单词中字符是否出现可以用26bit的整数表示

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

318. Maximum Product of Word Lengths

题目: Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Exa

Maximum Product of Word Lengths -- LeetCode

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

leetcode笔记:Maximum Product of Word Lengths

一. 题目描述 Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.

leetcode 318: Maximum Product of Word Lengths

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

318. Maximum Product of Word Lengths java solutions

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

【leetcode】Maximum Product of Word Lengths

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

318 Maximum Product of Word Lengths 最大单词长度乘积

给定一个字符串数组words,找到length(word[i]) * length(word[j])的最大值,并且两个单词不含公共的字母.你可以认为每个单词只包含小写字母.如果不存在这样的两个单词,返回 0.示例 1:输入 ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]返回 16两个单词可以为 "abcw", "

Leetcode 318 Maximum Product of Word Lengths 字符串处理+位运算

先介绍下本题的题意: 在一个字符串组成的数组words中,找出max{Length(words[i]) * Length(words[j]) },其中words[i]和words[j]中没有相同的字母,在这里字符串由小写字母a-z组成的. 对于这道题目我们统计下words[i]的小写字母a-z是否存在,然后枚举words[i]和words[j],找出max{Length(words[i]) * Length(words[j]) }. 小写字母a-z是26位,一般统计是否存在我们要申请一个bool