Для линейного решения вы можете использовать алгоритм Манахера. Существует еще один алгоритм, называемый алгоритмом Гусфилда, а ниже - код в java:
public class Solution {
char[] temp;
public int match(int a, int b,int len){
int i = 0;
while (a-i>=0 && b+i R)
{
z[i] = match(i, i,len);
L = i;
R = i + z[i] - 1;
}
else if (z[ii] == n)
{
z[i] = n + match(i-n, i+n,len);
L = i;
R = i + z[i] - 1;
}
else
{
z[i] = (z[ii]<= n)? z[ii]:n;
}
}
int n = 0, p = 0;
for (int i=0; i n)
n = z[p = i];
StringBuilder result=new StringBuilder();
for (int i=p-z[p]+1; i<=p+z[p]-1; ++i)
if(temp[i]!='.')
result.append(String.valueOf(temp[i]));
return result.toString();
}
}
. Вы можете найти больше о других решениях, таких как лучшее решение O (n ^ 2) или алгоритм Манахера из мой собственный блог .
SELECT * FROM some_table WHERE ID IN ('1001', '1002', '1003')
и если ваши известные идентификаторы взяты из другой таблицы
SELECT * FROM some_table WHERE ID IN (
SELECT KnownID FROM some_other_table WHERE someCondition
)
Первый (наивный) вариант:
SELECT * FROM some_table WHERE id IN ('1001', '2002', '3003' ... )
Однако мы должны быть в состоянии добиться большего. IN
очень плохо, когда у вас много предметов, и вы упомянули сотни таких идентификаторов. Что их создает? Откуда они? Можете ли вы написать запрос, который возвращает этот список? Если так:
SELECT *
FROM some_table
INNER JOIN ( your query here) filter ON some_table.id=filter.id
ИЛИ, как известно, медлительны в SQL.
Ваш вопрос не конкретичен, но в зависимости от ваших требований и ограничений я бы составил справочную таблицу с вашими идентификаторами и использовал предикат EXISTS:
select t.id from some_table t
where EXISTS (select * from lookup_table l where t.id = l.id)
Для фиксированного набора идентификаторов вы можете сделать:
SELECT * FROM some_table WHERE id IN (1001, 2002, 3003);
Для набора, который меняется каждый раз, вы можете захотеть создать таблицу для их хранения и затем выполнить запрос:
SELECT * FROM some_table WHERE id IN
(SELECT id FROM selected_ids WHERE key=123);
Другой подход заключается в использовании коллекций - синтаксис для этого будет зависеть от вашей СУБД.
Наконец, всегда есть такой «грязный» подход:
SELECT * FROM some_table WHERE '|1001|2002|3003|' LIKE '%|' || id || '|%';
Самый простой способ сделать это - использовать свойство tag
для pickerView. Я обычно определяю их в заголовке для удобства чтения. Вы можете установить тег в Интерфейсном Разработчике или в коде.
#define kPickerOne 0
#define kPickerTwo 1
Затем в вашем файле реализации ...
У нас есть похожая проблема в приложении, написанном для MS SQL Server 7. Хотя мне не нравится используемое решение, мы мы не знаем ничего лучшего ...
Насколько мне известно, в 2008 году существуют «лучшие» решения, но у нас есть нулевые клиенты, использующие это:)
Мы создали пользовательскую функцию с табличным значением, которая принимает запятую с разделителями. строка идентификаторов и возвращает таблицу идентификаторов. SQL тогда читается достаточно хорошо, и ни один из них не является динамическим, но все еще есть раздражающие двойные издержки:
1. Клиент объединяет идентификаторы в строку
2. SQL Server анализирует строку для создания таблицы идентификаторов.
Существует множество способов превратить '1,2,3,4,5' в таблицу идентификаторов, но хранимая процедура, использующая функцию, заканчивается выглядит как ...
CREATE PROCEDURE my_road_to_hell @IDs AS VARCHAR(8000)
AS
BEGIN
SELECT
*
FROM
myTable
INNER JOIN
dbo.fn_split_list(@IDs) AS [IDs]
ON [IDs].id = myTable.id
END
Самое быстрое - это поместить идентификаторы в другую таблицу и в JOIN
SELECT some_table.*
FROM some_table INNER JOIN some_other_table ON some_table.id = some_other_table.id
, где some_other_table будет иметь только одно поле (идентификаторы ) и все значения будут уникальными