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

这道题目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); }
}

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

  1. leetcode 318. Maximum Product of Word Lengths

    传送门 318. Maximum Product of Word Lengths My Submissions QuestionEditorial Solution Total Accepted: 1 ...

  2. [LeetCode] Maximum Product of Word Lengths 单词长度的最大积

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  3. 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 tw ...

  4. 318. Maximum Product of Word Lengths

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  5. Maximum Product of Word Lengths

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  6. 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 tw ...

  7. Java [Leetcode 318]Maximum Product of Word Lengths

    题目描述: Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where ...

  8. leetcode@ [318] Maximum Product of Word Lengths (Bit Manipulations)

    https://leetcode.com/problems/maximum-product-of-word-lengths/ Given a string array words, find the ...

  9. [Swift]LeetCode318. 最大单词长度乘积 | Maximum Product of Word Lengths

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  10. [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 tw ...

随机推荐

  1. vs2010 使用IIS EXPRESS出错.

      出现的问题:   解决方法: 左键单击Web项目,  查看属性选项卡, 将 托管管道模式改成Classic就可以了.

  2. 发布windows phone应用经历实谈

    经过这一次艰辛的发布应用的过程,看来果然这不是个简单的过程,不过经历过了一次之后感觉其实也没这么难,下面我将介绍我通过学生账号发布windows phone 8的应用到商店的全过程,其实整个过程最为困 ...

  3. centos mysql 操作

    安装mysqlyum -y install mysql-server 修改mysql配置 vi /etc/my.cnf 这里会有很多需要注意的配置项,后面会有专门的笔记 暂时修改一下编码(添加在密码下 ...

  4. C++ 类的成员函数指针 ( function/bind )

    这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...

  5. 利用Openvswitch实现不同物理机中的Docker容器互连

    1. 测试环境 75机(10.11.150.75):Red Hat Enterprise Linux Server 7.0,无外网访问权限,已安装Docker Server 74机(10.11.150 ...

  6. iOS-xib(自定义UITableViewCell)

    1.创建一个自定义的xib

  7. DMS平台从.NET 1.1升级到.NET 4.0的升级步骤

    1)复制新增的项目到4.0平台解决方案对应目录,添加到到解决方案中:2)合并公共文件(比如修改了FormMain主界面.基础类库.售后界面的修改)3)控件的修订(Dev少数属性可能需要手工调整为新的方 ...

  8. hdu 4768 Flyer 二分

    思路:由于最多只有一个是奇数,所以二分枚举这个点,每次判断这个点的左边区间段所有点的和作为 二分的依据. 代码如下: #include<iostream> #include<cstd ...

  9. (8)nehe教程2-多边形

    参考自: http://www.yakergong.net/nehe/ 你的第一个多边形: 在第一个教程的基础上,我们添加了一个三角形和一个四边形.也许你认为这很简单,但你已经迈出了一大步,要知道任何 ...

  10. UVA 557 Burger 排列组合递推

    When Mr. and Mrs. Clinton's twin sons Ben and Bill had their tenth birthday, the party was held at t ...