For e.g. MADAM is a palindrome but MADAM! is not. So we need to first remove noise character "!" from MADAM!
There are 2 tables in challenge. One contains the data from which we need to find the Palindromes and another contains noise words.
- Sample Data
- Table - Sentence
ID Sentence -- ------------------------------- 1 Hello Madam! how are you Madam? 2 She peep through the window 3 This is without any Palindrome
- Table - Noise
ID Noise -- ----- 1 ? 2 !
- Expected Results
ID Sentence PalindromeFound PalandromicWords FoundAt -- ------------------------------- --------------- ---------------- ------------- 1 Hello Madam! how are you Madam? 2 Madam Position : 2,6 2 She peep through the window 1 peep Position : 2 3 This is without any Palindrome 0 NULL NULL
- Rules
- ID should be sorted in Ascending Order.
- The program should run in SQL SERVER 2005 and above.
- If no palindrome found in the sentence, then PalindromeFound column will be 0,PalandromicWords and FoundAt column will be NULL.
- The output should be in the same way as it has been shown. Column names should be exactly the same and the result must be sorted in Ascending order of ID.
- 個人解法
DECLARE @Sentence TABLE(ID INT IDENTITY, Sentence VARCHAR(1000))
INSERT INTO @Sentence(Sentence)
SELECT 'Hello Madam! how are you Madam?' UNION ALL
SELECT 'She peep through the window' UNION ALL
SELECT 'This is without any Palindrome'
DECLARE @Noise TABLE(ID INT IDENTITY, Noise VARCHAR(10))
INSERT INTO @Noise(Noise)
SELECT '?' UNION ALL
SELECT '!'
;
WITH CTE AS
(
SELECT ID , Sentence , 1 AS StartPos , CHARINDEX(SPACE(1),Sentence) AS EndPos
FROM @Sentence
UNION ALL
SELECT ID , Sentence , EndPos + 1 , CHARINDEX(SPACE(1),Sentence,EndPos + 1)
FROM CTE
WHERE EndPos > 0
)
,
CTE2 AS
(
SELECT T.ID , T.StringCount , ISNULL(REPLACE(String,Noise,''),String) AS ClearNoise
FROM
(
SELECT
ID ,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY StartPos) AS StringCount ,
SUBSTRING
(
Sentence ,
StartPos ,
ISNULL(NULLIF(EndPos,0),LEN(Sentence) + 1) - StartPos
) AS String
FROM CTE
) AS T
LEFT JOIN @Noise AS N ON CHARINDEX(N.Noise,T.String) > 0
)
,
CTE3 AS
(
SELECT *
FROM CTE2
WHERE ClearNoise = REVERSE(ClearNOISE)
)
SELECT
S.ID ,
S.Sentence ,
ISNULL(T.PalindromeFound,0) AS PalindromeFound ,
T.PalandromicWords ,
T.FoundAt
FROM @Sentence AS S
LEFT JOIN
(
SELECT
T1.ID ,
T1.ClearNoise AS PalandromicWords ,
COUNT(T1.ID) AS PalindromeFound ,
'Position :' +
STUFF
(
(
SELECT ',' + CAST(T2.StringCount AS varchar(2))
FROM CTE3 AS T2
WHERE T1.ID = T2.ID AND T1.ClearNoise = T2.ClearNoise
ORDER BY T2.StringCount
FOR XML PATH('')
) ,
1 ,
1 ,
''
) AS FoundAt
FROM CTE3 AS T1
GROUP BY T1.ID , T1.ClearNoise
) AS T ON S.ID = T.ID
ORDER BY ID
沒有留言:
張貼留言